Динамически назначайте "действие" в 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!"
    }

}

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

Другие вопросы по тегам