3 回答
TA贡献1815条经验 获得超6个赞
更新到Swift 4,利用userInfo:
class TimerSample { var timer: Timer? func startTimer() { timer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(eventWith(timer:)), userInfo: [ "foo" : "bar" ], repeats: true) } // Timer expects @objc selector @objc func eventWith(timer: Timer!) { let info = timer.userInfo as Any print(info) }}
TA贡献1799条经验 获得超6个赞
这将有效:
override func viewDidLoad() {
super.viewDidLoad()
// Swift block syntax (iOS 10+)
let timer = Timer(timeInterval: 0.4, repeats: true) { _ in print("Done!") }
// Swift >=3 selector syntax
let timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
// Swift 2.2 selector syntax
let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true)
// Swift <2.2 selector syntax
let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true)
}
// must be internal or public.
@objc func update() {
// Something cool
}
对于Swift 4,您希望获取选择器的方法必须公开给Objective-C,因此@objc必须将属性添加到方法声明中。
TA贡献1818条经验 获得超11个赞
重复的事件
您可以使用计时器多次执行操作,如以下示例所示。计时器调用一种方法每半秒更新一次标签。
这是代码:
import UIKitclass ViewController: UIViewController { var counter = 0 var timer = Timer() @IBOutlet weak var label: UILabel! // start timer @IBAction func startTimerButtonTapped(sender: UIButton) { timer.invalidate() // just in case this button is tapped multiple times // start the timer timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true) } // stop timer @IBAction func cancelTimerButtonTapped(sender: UIButton) { timer.invalidate() } // called every time interval from the timer func timerAction() { counter += 1 label.text = "\(counter)" }}
延迟事件
您还可以使用计时器在将来的某个时间安排一次性事件。与上述示例的主要区别在于您使用repeats: false
而不是true
。
timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(delayedAction), userInfo: nil, repeats: false)
上面的示例调用delayedAction
在设置计时器后两秒钟命名的方法。它不会重复,但timer.invalidate()
如果您需要在事件发生之前取消该事件,您仍然可以打电话。
笔记
如果有可能多次启动计时器实例,请确保先使旧计时器实例无效。否则你将失去对计时器的引用,你不能再停止它了。(见这个问答)
不需要时使用计时器。请参阅“iOS应用能源效率指南”中的计时器部分。
有关
- 3 回答
- 0 关注
- 1115 浏览
添加回答
举报