使用 NSTimer 时发送到实例的无法识别的选择器

Posted

技术标签:

【中文标题】使用 NSTimer 时发送到实例的无法识别的选择器【英文标题】:unrecognized selector sent to instance when using NSTimer 【发布时间】:2018-09-02 14:10:34 【问题描述】:

当我启动我的代码时,我遇到了控制台错误

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[_SwiftValue 计数器]:无法识别的选择器已发送到实例

代码如下

class Status: UIViewController 
    @IBOutlet var health: UIProgressView!
    @IBOutlet var happiness: UIProgressView!
    @IBOutlet var energy: UIProgressView!
    @IBOutlet var hygiene: UIProgressView!
    @IBOutlet var pain: UIProgressView!
    @IBOutlet var hunger: UIProgressView!

    var total:Double = 1

    @objc func counter() 
       total -= 0.05
    

    let timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector:#selector(counter), userInfo: nil, repeats:true)

    override func viewDidLoad() 
        super.viewDidLoad()

        hunger.setProgress(Float(total), animated: true)
        happiness.setProgress(Float(total), animated: true)
        energy.setProgress(Float(total), animated: true)
        hygiene.setProgress(Float(total), animated: true)
        pain.setProgress(Float(total), animated: true)
        health.setProgress(Float(total), animated: true)
    

还有一张我收到的完整错误消息的图片 Error Message

【问题讨论】:

【参考方案1】:

当您使用这样的默认值时,self 尚未完全初始化。使用隐式展开的可选项并将调用移至viewDidLoad

var timer: Timer!

override func viewDidLoad() 
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector:#selector(counter), userInfo: nil, repeats:true)

这假设您在视图控制器完成从 nib 加载之前不需要timer,这应该是大部分时间。

【讨论】:

以上是关于使用 NSTimer 时发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用 NSTimer 时发送到类的无法识别的选择器; NSInvalidArgumentException

[__NSCFTimer copyWithZone:]:无法识别的选择器发送到实例

NSInvalidArgumentException,使用 performSegueWithIdentifier 时发送到实例的无法识别的选择器

使用 UIPanGesture 时发送到实例的无法识别的选择器

以编程方式回调按钮时发送到实例的无法识别的选择器

在访问 PFObject 成员时解析“发送到实例的无法识别的选择器”