2017-02-01 3 views
1

Использования Swift 3, Xcode 8.2.1Свифта: Передача параметра селектор

Метод:

func moveToNextTextField(tag: Int) { 
    print(tag) 
} 

Линия ниже компиляции хорошо, но tag имеет неинициализированное значение:

let selector = #selector(moveToNextTextField) 
Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: selector, userInfo: nil, repeats: false) 

Однако мне нужно передать параметр. Ниже компилируется:

let selector = #selector(moveToNextTextField(tag: 2)) 

Swift Compile Error: 
Argument of #selector does not refer to an @objc method, property, or initializer. 

Как передать аргумент селектору?

ответ

6

#selector описывает только подпись метода. В вашем случае правильный способ инициализации селектора -

let selector = #selector(moveToNextTextField(tag:)) 

Таймер имеет общий механизм действия цели. Цель, как правило, self и action - это метод, который принимает один параметр sender: Timer. Вы должны сохранить дополнительные данные userInfo словаря и извлечь его из sender параметра в методе:

func moveToNextTextField(sender: Timer) { 
    print(sender.userInfo?["tag"]) 
} 
... 
let selector = #selector(moveToNextTextField(sender:)) 
Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: selector, userInfo: ["tag": 2], repeats: false) 
+1

@ user1107173 обновил ответ с помощью некоторого кода. – hybridcattt

+0

Вадиан правильный. Вы не можете передавать пользовательский параметр через таймер. Вы должны установить этот параметр в поле userInfo таймера. (Селектор может либо пройти в таймере в качестве параметра, либо без параметров). –

3

Вы не можете передать пользовательский параметр с помощью Timer действия.

Либо

#selector(moveToNextTextField) 
... 
func moveToNextTextField() 

или

#selector(moveToNextTextField(_:)) 
... 
func moveToNextTextField(_ timer : Timer) 

не поддерживается, ничего другого.

Для передачи пользовательских параметров используйте словарь userInfo.

Смежные вопросы