在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!"
}
}
这里的情况变得有些棘手,当我尝试建立,我没有得到任何错误(甚至不一个警告)。然而,当我运行应用程序,挖掘bttn
在fileB.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!"
}
}
答
是的,你可以。这里的问题是你将按钮本身作为动作的目标。只需在添加动作时传递正确的目标,在本例中就是视图控制器的实例。
感谢你的帮助。这工作。在'Target:self'中,self指的是viewcontroller的实例,对吗?并感谢大家的帮助。 –