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

时间:2016-01-26 23:52:53

标签: swift exception selector nstimer

我正在尝试使用NSTimer以一定的间隔运行一个函数,但每次运行时程序都会崩溃并出现异常:

+[Project.Class updateLabel]: unrecognized selector sent to class...
Terminating app due to uncaught exception "NSInvalidArgumentException".

代码如下:

class SecondViewController: UIViewController {

// MARK: Properties

override func viewDidLoad() {
    super.viewDidLoad()

    do {
        try updateLabel()
        try startTimer()
    }
    catch{
        self.showAlert()
    }
}

@IBOutlet weak var i2cLabel: UILabel!

// MARK: Actions

func startTimer() throws {
    _ = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("updateLabel"), userInfo: nil, repeats: true)

}

func showAlert() {
}

func updateLabel() throws {
}
}

如果我注释掉NSTimer行,程序编译并运行就好了。

请注意,选择器函数updateLabel()不接受任何参数,因此将其作为不带冒号后缀的选择器调用应该有效。这似乎是这个问题的独特之处。

1 个答案:

答案 0 :(得分:1)

尝试将您的代码更新为:

override func viewDidLoad() {
    super.viewDidLoad()

    do {
        updateLabel()
        try startTimer()
    }
    catch{
        self.showAlert()
    }
}


// MARK: Actions

func startTimer() throws {
    _ = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("updateLabel"), userInfo: nil, repeats: true)

}

func showAlert() {
}

func updateLabel() {

}

似乎:NSTimer不知道调用函数throws。所以它会崩溃。

我试图找到一些官方或一些文章描述它。但我现在找不到可悲的。

您可以参考此问题:Reference

希望这有帮助!