У вас возникли проблемы с NSTimer (Swift)

- ИЗМЕНЕНА ОБНОВЛЕННАЯ ИНФОРМАЦИЯ -

То, что я хочу сделать, это вызвать функцию с именем timerFunc раз в пять секунд с помощью метода NSTimer.scheduledTimerWithTimeInterval, проблема в том, что во время выполнения я получаю сообщение об ошибке

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-      
[Animation.ViewController timerFunc:]: unrecognized selector sent to instance 0x7fe548d66040'

В журнале вывода. Я искал других людей NSTimers безрезультатно, я вижу, что некоторые из них имеют селектор как selector: Selector("timerFunc:") вместо selector: Selector("timerFunc") в обоих направлениях, однако, дают ошибку. Другое дело, что функция timerFunc и NSTimer находятся внутри viewDidLoad, есть ли проблемы с этим? Любое понимание проблемы очень ценится, спасибо за чтение.

timerFunc ниже

func timerFunc(){

    println("Timer")
}

NSTimer ниже

NSTimer.scheduledTimerWithTimeInterval(
        5.0,
        target: self,
        selector: Selector("timerFunc"),
        userInfo: nil,
        repeats: true)

Ответ 1

Другое дело, что и функция timerFunc, и NSTimer находятся внутри viewDidLoad, есть ли проблемы с этим?

Да. Это твоя проблема. timerFunc не может быть вложен внутри viewDidLoad, он должен быть функцией верхнего уровня на том же уровне, что и viewDidLoad.

class ViewController: UIViewController {

    override func viewDidLoad() {
        ....
        NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc", userInfo: nil, repeats: true)
    }

    func timerFunc() {
        println("Timer")
    }

}

Когда срабатывает таймер, он вызывет функцию, указанную селектором, на объект, назначенный целевым объектом. То есть, он вызовет self.timerFunc(). Когда ваш timerFunc() вложен внутри viewDidLoad, он не может его найти.

Ответ 2

Таймеры не будут работать с частными обратными вызовами метода. Кроме того, убедитесь, что ваш класс наследуется от NSObject. Классы Pure Swift не будут работать.

Более подробную информацию можно найти здесь: https://github.com/NxSoftware/NxSwiftTimer

Ответ 3

Моя проблема заключалась в том, что селектор указывал на частную функцию.

Ответ 4

Первый параметр метода Swift не включает метку. Все остальные обычно делают. Вы должны ожидать, что синтаксис будет следующим:

NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc", userInfo: nil, repeats: true)

Ответ 5

При использовании селектора в Swift вам нужно использовать псевдофункцию Selector() вокруг имени функции:

NSTimer.scheduledTimerWithTimeInterval(5.0,   target: self, 
                                            selector: Selector("timerFunc"), 
                                            userInfo: nil,
                                             repeats: true);

Причина кажущихся запутанными ошибок, которые, как я подозреваю, связана с тем, что компиляторы не могут сопоставить ваш список аргументов с определенным методом из-за неправильного типа имени селектора (строка, а не селектор).

Это также объясняет тот факт, что когда вам удалось его собрать (как упоминалось в комментариях к другому ответу), он не удался во время выполнения. Проверка типа во время компиляции не позволяет получить такую ​​ошибку (следовательно, исключение среды выполнения, сообщающее "непризнанный селектор" ).