У вас возникли проблемы с 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);
Причина кажущихся запутанными ошибок, которые, как я подозреваю, связана с тем, что компиляторы не могут сопоставить ваш список аргументов с определенным методом из-за неправильного типа имени селектора (строка, а не селектор).
Это также объясняет тот факт, что когда вам удалось его собрать (как упоминалось в комментариях к другому ответу), он не удался во время выполнения. Проверка типа во время компиляции не позволяет получить такую ошибку (следовательно, исключение среды выполнения, сообщающее "непризнанный селектор" ).