Нераспознанный селектор отправлен экземпляру NSTimer Swift

Я пытаюсь разработать приложение, включающее простую функцию секундомера. Я использую 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, поэтому, пожалуйста, помогите!


person That_one_guy    schedule 23.11.2014    source источник


Ответы (3)


пусть updateTime будет методом класса.
И если он находится в чистом классе Swift, вам нужно будет предварить объявление этого метода @objc, например:

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

     }
}
person mqshen    schedule 11.12.2014
comment
Флаг @objc, по-видимому, не нужен, по крайней мере, для Swift 1.2. Однако я столкнулся с той же ошибкой, потому что моя подпись селектора была неправильной. Его необходимо настроить для получения NSTimer. например func mySelector(timer: NSTimer) - person Mason G. Zhwiti; 04.09.2015

Вы определили updateTime как локальную функцию для Stopwatch, поэтому она недоступна за пределами своей области. Вы должны переместить его на уровне класса (так же, как Stopwatch), чтобы он был доступен.

Однако я заметил, что есть некоторые локальные переменные, которые, вероятно, должны быть свойствами экземпляра.

person Antonio    schedule 23.11.2014

Другая возможность: убедитесь, что ваша функция селектора не throw, так как это также даст вам нераспознанное исключение селектора:

func mySelector(timer: NSTimer) throws {
}
person weltan    schedule 08.03.2016