2.2预定定时器返回"视图控制器没有成员..."

时间:2016-09-08 17:56:47

标签: ios swift nstimer

我很有智慧在这里试图弄清楚如何使这个NSTimer工作。为了清晰起见,粘贴我的整个代码。重要的部分是粗体。

import UIKit
import QuartzCore
import Foundation

class ViewController: UIViewController {
@IBOutlet weak var outerCircle: UIImageView!

@IBOutlet weak var innerCircle: UIImageView!

@IBOutlet weak var instructionLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    var timer: NSTimer!


    timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: #selector(ViewController.runTimedCode), userInfo: nil, repeats: true)


    func runTimedCode() {


        UIView.animateWithDuration(5, delay:0, options:[], animations: {
            //Inhale
            self.innerCircle.transform = CGAffineTransformMakeScale(3.5, 3.5)
            self.instructionLabel.text = "Inhale"

            }, completion: { finish in
                //Exhale
                UIView.animateWithDuration(5, delay:0, options:[], animations: {

                    self.innerCircle.transform = CGAffineTransformMakeScale(1, 1)
                    self.instructionLabel.text = "Exhale"
                    }, completion: nil)
        })

    }


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }


}

我想要" runTimedCode()"每10秒运行一次。我目前收到错误:

timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: #selector(ViewController.runTimedCode), userInfo: nil, repeats: true)

错误显示"键入' ViewController'没有会员' runTimedCode'。

当我拿ViewController时。 out,我得到一个不同的错误:使用局部变量' runTimedCode'在宣布之前。

最后,当我将该行移到代码的底部时,我得到了"' #selector'指的是未暴露于Objective-C的方法。

我觉得我已经诚实地尝试了一切,让这个计时器工作。我看过每一个可以想象的线程。我是否对计时器如何运作有一些基本的误解?

3 个答案:

答案 0 :(得分:4)

问题是您已将func runTimedCode() {...} 放在另一个函数viewDidLoad中。你不能这样做。将它放在视图控制器的顶层。

答案 1 :(得分:2)

您的viewcontroller没有runTimedCode方法。

你在viewDidLoad函数中声明它,你应该把它移到外面。

答案 2 :(得分:0)

每个人都是对的,您在runTimedCode内定义了viewDidLoad函数,因此它的范围是错误的。此外,您应该避免在完成块内嵌套动画。尝试使用我为您准备的代码。

import Foundation

class ViewController: UIViewController {

    // MARK: Outlets

    @IBOutlet weak var outerCircle: UIImageView!
    @IBOutlet weak var innerCircle: UIImageView!
    @IBOutlet weak var instructionLabel: UILabel!

    // MARK: Properties

    var timer: NSTimer?

    // MARK: Lifecycle

    override func viewDidLoad() {

        super.viewDidLoad()

        timer = NSTimer.scheduledTimerWithTimeInterval(5,
            target: self,
            selector: #selector(timerDidFinish),
            userInfo: nil,
            repeats: true
        )
    }

    // MARK: NSTimer

    func timerDidFinish() {

        UIView.animateWithDuration(5, delay: 0, options: [.Autoreverse], animations: {
            self.innerCircle.transform = CGAffineTransformMakeScale(3.5, 3.5)
            self.instructionLabel.text = "Inhale"
        }, completion: nil)
    }
}