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 关注
- 1171 浏览
添加回答
举报
