我在我的智慧结束这里试图弄清楚如何让这个ntimer工作。为了清晰起见,粘贴我的全部代码。
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)
错误提示"Type 'ViewController'没有成员'runTimedCode'.
当我取ViewController。出,我得到一个不同的错误:在声明之前使用局部变量'runTimedCode'。
最后,当我将这行移动到代码的底部时,我得到"'#selector'的参数指的是一个不暴露于Objective-C的方法。
我觉得我已经诚实地尝试了一切让这个计时器工作。我看过所有能想到的线索。我对计时器的功能有什么基本的误解吗?
问题是您将func runTimedCode() {...}
放在另一个函数viewDidLoad
中。你不能这么做。把它放在视图控制器的顶层
你的视图控制器没有runTimedCode
方法
你在viewDidLoad
函数中声明它,你应该把它移到外面
每个人都是对的,你在viewDidLoad
内定义了runTimedCode
函数,所以它在错误的范围内。另外,你应该避免在完成块中嵌套动画。尝试使用下面我为您准备的代码。
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)
}
}