我注意到我有很多功能可以在我的一个视图控制器中动态添加按钮,这显然违背了DRY原则。
为了解决这个问题,我写了一个命中一切configureButton
函数:
func configureButton (button: UIButton, action: String, title: String, pos: [CGFloat]) {
button.addTarget(self, action: action,
forControlEvents: UIControlEvents.TouchUpInside)
// ^ throws an error
// button.addTarget(self, action: "goToScanner",
// forControlEvents: UIControlEvents.TouchUpInside)
/* configure everything else */
self.view.addSubview(button)
}
当我有许多不同的功能时,我只是写了类似
的东西button.addTarget(self, action: "goToScanner", // <-- note the string
forControlEvents: UIControlEvents.TouchUpInside)
在每个中,其中"goToScanner"
是我想要点击的功能。
我希望能够将button.addTarget
的操作参数动态传递给configureButton
:
configureButton(scanButton, action: "goToScanner", title: "Scan", pos: [36.0, 300])
我尝试传递一个句子() -> ()
,但这没有用。
我该如何解决这个问题?
答案 0 :(得分:2)
你的方法应该是
func configureButton (button: UIButton, action: Selector, title: String, pos: [CGFloat])
请注意它如何使用Selector
代替String
。
这是因为Swift没有Selector
的内置实现,你传递一个字符串,字符串文字被推断为Selector
(就像输入一样)数字文字将作为int,float,NSNumber等工作。