如何在Swift中使用NSTimer?

 恩和佳蓉伟诚 发布于 2023-01-12 05:35

我试过了

var timer = NSTimer()
timer(timeInterval: 0.01, target: self, selector: update, userInfo: nil, repeats: false)

但是,我说错了

'(timeInterval: $T1, target: ViewController, selector: () -> (), userInfo: NilType, repeats: Bool) -> $T6' is not identical to 'NSTimer'

Oscar Swanro.. 522

这将有效:

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必须将属性添加到方法声明中.

10 个回答
  • 更新到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)
        }
    
    }
    

    2023-01-12 05:41 回答
  • 重复的事件

    您可以使用计时器多次执行操作,如以下示例所示.计时器调用一种方法每半秒更新一次标签.

    在此输入图像描述

    这是代码:

    import UIKit
    
    class 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应用能源效率指南"中的计时器部分.

    有关

    如何使用Swift中的日期和时间

    2023-01-12 05:41 回答
  • 这将有效:

    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必须将属性添加到方法声明中.

    2023-01-12 05:45 回答
  • 从iOS 10开始,还有一个新的基于块的Timer工厂方法,它比使用选择器更清晰:

        _ = Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { timer in
            label.isHidden = true
        }
    

    2023-01-12 05:50 回答
  • 迅捷5

    我个人更喜欢带有封闭块的Timer:

        Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { (_) in
           // TODO: - whatever you want
        }
    

    2023-01-12 05:54 回答
  • 对于swift 3和Xcode 8.2(很高兴有块,但如果你为iOS9编译并想要userInfo):

    ...

            self.timer = Timer(fireAt: fire,
                               interval: deltaT,
                               target: self,
                               selector: #selector(timerCallBack(timer:)),
                               userInfo: ["custom":"data"],
                               repeats: true)
    
            RunLoop.main.add(self.timer!, forMode: RunLoopMode.commonModes)
            self.timer!.fire()
    }
    
    func timerCallBack(timer: Timer!){
            let info = timer.userInfo
            print(info)
        }
    

    2023-01-12 05:58 回答
  • Swift 3,iOS 10之前

    func schedule() {
        DispatchQueue.main.async {
          self.timer = Timer.scheduledTimer(timeInterval: 20, target: self,
                                       selector: #selector(self.timerDidFire(timer:)), userInfo: nil, repeats: false)
        }
      }
    
      @objc private func timerDidFire(timer: Timer) {
        print(timer)
      }
    

    Swift 3,iOS 10+

    DispatchQueue.main.async {
          self.timer = Timer.scheduledTimer(withTimeInterval: 20, repeats: false) { timer in
            print(timer)
          }
        }
    

    笔记

    它需要在主队列中

    回调函数可以是公共的,私有的,...

    需要回调函数 @objc

    2023-01-12 06:00 回答
  • 检查:

    var timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
    

    2023-01-12 06:02 回答
  • SimpleTimer(Swift 3.1)

    为什么?

    这是swift中的一个简单的计时器类,使您能够:

    本地范围的计时器

    可链接

    一个衬里

    使用常规回调

    用法:

    SimpleTimer(interval: 3,repeats: true){print("tick")}.start()//Ticks every 3 secs
    

    码:

    class SimpleTimer {/*<--was named Timer, but since swift 3, NSTimer is now Timer*/
        typealias Tick = ()->Void
        var timer:Timer?
        var interval:TimeInterval /*in seconds*/
        var repeats:Bool
        var tick:Tick
    
        init( interval:TimeInterval, repeats:Bool = false, onTick:@escaping Tick){
            self.interval = interval
            self.repeats = repeats
            self.tick = onTick
        }
        func start(){
            timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(update), userInfo: nil, repeats: true)//swift 3 upgrade
        }
        func stop(){
            if(timer != nil){timer!.invalidate()}
        }
        /**
         * This method must be in the public or scope
         */
        @objc func update() {
            tick()
        }
    }
    

    2023-01-12 06:06 回答
  • 你需要在Swift 3中使用Timer而不是NSTimer.

    这是一个例子:

    Timer.scheduledTimer(timeInterval: 1, 
        target: self, 
        selector: #selector(YourController.update), 
        userInfo: nil, 
        repeats: true)
    
    // @objc selector expected for Timer
    @objc func update() {
        // do what should happen when timer triggers an event
    }
    

    2023-01-12 06:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有