Динамически назначайте "действие" в uibutton.addTarget
Пожалуйста, потерпите меня, так как я новичок в возрасте -4 недель.
Я создал следующие 2 функции в файле A.swift
func custombttn(theSelector:Selector)-> UIButton{
let bttn = UIButton(frame: CGRect(x:20, y:400, width:200, height:30))
bttn.setTitle("tap this button", for: UIControlState.normal)
bttn.backgroundColor = UIColor.black
bttn.setTitleColor(UIColor.magenta, for: UIControlState.normal)
bttn.addTarget(bttn, action: theSelector, for: UIControlEvents.touchUpInside)
return bttn
}
func customtxtfld() -> UITextField{
let txtField = UITextField(frame: CGRect(x:20, y:360, width:200, height:30))
txtField.borderStyle = UITextBorderStyle.roundedRect
txtField.backgroundColor = UIColor.magenta
txtField.placeholder = "Do you like me now..?"
return txtField
}
Причиной custombttn(theSelector:Selector)
является то, что я хочу передать функцию динамически на кнопку в моем файле viewcontroller.
Теперь, перемещая файл B.swift, у меня есть следующий код...
class TabOneViewController: UIViewController{
let txt = customtxtfld()
let bttn = custombttn(theSelector: #selector(updatetxt))
override func loadView() {
super.loadView()
view.addSubview(txt)
view.addSubview(bttn)
}
func updatetxt(){
txt.text = "hello, you!"
}
}
Здесь все становится сложнее, когда я пытаюсь построить, я не получаю никакой ошибки (даже предупреждения). Однако, когда я запускаю приложение и нажимаю bttn
в fileB.swift я получаю следующую ошибку во время выполнения:
Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: '-[UIButton updatetxt]: нераспознанный селектор отправлен в экземпляр 0x7f8453415670'
Если у меня в файле fileB.swift есть 2 или более функций, которые я хочу динамически назначить части действия addTarget, есть ли способ динамически передать селектор кнопке?
Цените ваше время и помощь. Пожалуйста, дайте мне знать, если мне нужно что-то объяснить дальше.
2 ответа
Это сбой, потому что ваша цель кнопки неверна.
func custombttn(target:Any, theSelector:Selector)-> UIButton{
let bttn = UIButton(frame: CGRect(x:20, y:400, width:200, height:30))
bttn.setTitle("tap this button", for: UIControlState.normal)
bttn.backgroundColor = UIColor.black
bttn.setTitleColor(UIColor.magenta, for: UIControlState.normal)
bttn.addTarget(target, action: theSelector, for: UIControlEvents.touchUpInside)
return bttn
}
И используйте это так
class TabOneViewController: UIViewController{
let txt = customtxtfld()
override func loadView() {
super.loadView()
view.addSubview(txt)
let bttn = custombttn(target:self, theSelector: #selector(updatetxt))
view.addSubview(bttn)
}
func updatetxt(){
txt.text = "hello, you!"
}
}
Да, ты можешь. Проблема здесь в том, что вы передали саму кнопку в качестве цели для действия. Просто передайте правильную цель при добавлении действия, которое в данном случае является экземпляром вашего контроллера представления.