分配'动作'动态地在uibutton.addTarget中

时间:2017-07-02 14:06:08

标签: ios swift3 uibutton selector addtarget

请耐心等待我,因为我是一个快四周大的新人 - 。

我在fileA.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文件中的按钮。

现在,移动fileB.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!"
    }

}

这里的事情变得棘手,当我尝试构建时,我没有得到任何错误(甚至没有警告)。但是,当我运行应用程序并点击 fileB.swift 中的bttn时,我在运行时遇到以下错误:

  

由于未捕获的异常而终止应用   ' NSInvalidArgumentException',原因:' - [UIButton updatetxt]:   无法识别的选择器发送到实例0x7f8453415670'

如果我在fileB.swift中有两个或更多函数,我希望动态分配给addTarget的动作部分,有什么方法可以将选择器动态地传递给按钮..?

感谢您的时间和帮助。如果我需要进一步解释,请告诉我。

2 个答案:

答案 0 :(得分:0)

是的,你可以。这里的问题是您将按钮本身作为操作的目标。添加动作时只需传递正确的目标,在本例中是视图控制器的实例。

答案 1 :(得分:0)

因为您的按钮目标错误而崩溃了。

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!"
    }

}