在uibutton.addTarget

问题描述:

中动态分配“动作”,请耐心等待,因为我是新手,快到-4周。在uibutton.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)背后的原因,是我想动态传递的功能按钮在我的视图 - 控制文件。现在

,移动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!" 
    } 

} 

这里的情况变得有些棘手,当我尝试建立,我没有得到任何错误(甚至不一个警告)。然而,当我运行应用程序,挖掘bttnfileB.swift,我在运行时出现以下错误:

终止应用程序由于未捕获的异常 “NSInvalidArgumentException”的,理由是:“ - [的UIButton updatetxt]: 无法识别的选择发送到实例0x7f8453415670'

如果我有我的fileB.swift 2层或更多的功能,我想动态地分配给addTarget的动作部分,有什么办法,我可以动态地将选择器传递给按钮..?

感谢您的时间和帮助。请让我知道是否需要进一步解释。

由于您的按钮目标不正确而崩溃。

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

} 
+0

感谢你的帮助。这工作。在'Target:self'中,self指的是viewcontroller的实例,对吗?并感谢大家的帮助。 –

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