【问题标题】:Why is this Swift Timer not firing?为什么这个 Swift Timer 没有触发?
【发布时间】:2021-01-18 19:27:13
【问题描述】:
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

@IBOutlet weak var Time: UILabel!

let everyMinuteTimer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.updateTime), userInfo: nil, repeats: true)

@objc func updateTime() {

    let currentDateTime = Date()

    let formatter = DateFormatter()
    formatter.timeStyle = .medium
    formatter.dateStyle = .long

    let dateTimeString = formatter.string(from: currentDateTime)

    Time.text = dateTimeString
}

我试图让这个计时器触发以更新时间标签,但它似乎没有触发并保持文本静态。

这是我不断收到的错误:

'无法识别的选择器发送到实例 0x600000faed90'

【问题讨论】:

    标签: swift timer nstimer


    【解决方案1】:

    问题在于您的代码应该在方法中。初始化计时器属性时没有self。你有两个选择。

    1. 将您的计时器声明为lazy var

    2. 将您的计时器声明移至任何视图控制器方法,通常是viewDidLoad

    请注意,我还会更改您的计时器间隔频率。每秒100次太多了。如果您只需要在分钟更改时触发您的方法,您可以安排您的计时器在下一个偶数分钟开始,并每分钟重复一次。

    【讨论】:

    【解决方案2】:

    这个问题是一个涉及self 含义的棘手问题。改变

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    let everyMinuteTimer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.updateTime), userInfo: nil, repeats: true)
    

    override func viewDidLoad() {
        super.viewDidLoad()
        self.everyMinuteTimer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.updateTime), userInfo: nil, repeats: true)
    }
    
    var everyMinuteTimer : Timer!
    

    我知道这看起来很不可思议,但这会解决问题。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多