我很有智慧在这里试图弄清楚如何使这个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的方法。
我觉得我已经诚实地尝试了一切,让这个计时器工作。我看过每一个可以想象的线程。我是否对计时器如何运作有一些基本的误解?
答案 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)
}
}