实例 NSTimer Swift 收到未识别的选择器

7

我正在开发一个包含简单秒表功能的应用程序。我使用的是Xcode 6和Swift语言。以下是FirstViewController中的代码:

@IBAction func Stopwatch (Sender:UIButton) { 

var startTime = NSTimeInterval()

    func updateTime(timer:NSTimer) {

        //Find Current TIme

        var currentTime = NSDate.timeIntervalSinceReferenceDate()

        //Find the difference between current time and start time

        var elapsedTime :NSTimeInterval = currentTime - startTime

        //calculate the minutes in elapsed time.
        let minutes = UInt(elapsedTime / 60.0)
        elapsedTime -= (NSTimeInterval(minutes) * 60)

        //calculate the seconds in elapsed time.
        let seconds = UInt(elapsedTime)
        elapsedTime -= NSTimeInterval(seconds)

        //find out the fraction of milliseconds to be displayed.
        let hours = UInt(elapsedTime * 100)

        let strMinutes = minutes > 9 ? String(minutes):String(minutes)
        let strSeconds = seconds > 9 ? String(seconds):String(seconds)
        let strHours = hours > 9 ? String(hours):String(hours)

        //assign text to Label
        elapsedTimeLabel.text = "You have slept for \(strHours)"
    }

    //Timer 
    var timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("updateTime:"), userInfo: nil, repeats: true)
    startTime = NSDate.timeIntervalSinceReferenceDate()

}
}

每次我在 iOS 模拟器中运行该应用程序时,当我按下按钮(执行秒表功能)时,应用程序都会崩溃。错误信息始终显示为:
2014-11-23 11:44:53.617 Sleep[9630:644637] -[Sleep.FirstViewController updateTime:]: 
unrecognized selector sent to instance 0x7ff6d9676e80
2014-11-23 11:44:53.622 Sleep[9630:644637] *** Terminating app due to uncaught exception 
'NSInvalidArgumentException', reason: '-[Sleep.FirstViewController updateTime:]: unrecognized 
selector sent to instance 0x7ff6d9676e80'
*** First throw call stack:

我不知道为什么会发生这种情况,而且我对iOS编程还很陌生,请帮忙!
3个回答

14

将updateTime定义为一个类方法。
如果它在纯Swift类中,则需要在该方法的声明前加上@objc:

class A {
     @objc func updateTime(timer:NSTimer) {

     }
}

2
@objc 标记似乎不是必需的,至少在 Swift 1.2 中不是必需的。然而,我遇到了相同的错误,因为我的选择器签名是错误的。它需要设置为接收一个 NSTimer。例如:func mySelector(timer: NSTimer) - Mason G. Zhwiti

0
另一种可能性是:确保您的选择器函数不会抛出异常,因为这也会导致无法识别的选择器异常:
func mySelector(timer: NSTimer) throws {
}

0

你已经将updateTime定义为Stopwatch的本地函数,因此它在其范围之外不可用。你应该将它移动到类级别(与Stopwatch相同),以便访问。

但是我注意到有一些本地变量可能应该是实例属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接