我有一个 UIDatePicker
。选择日期后,我调用此方法
func goToNextScreen(selectedDate: Date) {
//...
}
现在我添加了一个UIButton
。在该按钮操作中,我想调用没有任何日期值的相同方法 goToNextScreen
。日期值在下一个屏幕中是可选的。我尝试了以下代码
btn.addTarget(self, action: #selector(goToNextScreen), for: .touchUpInside)//goToNextScreen(_:)
@objc func goToNextScreen(selectedDate: Date? = nil) {
//...
}
点击按钮时,应用程序崩溃。
如何在不添加其他方法的情况下解决这个问题?如果不可能为什么我的方法不起作用
最佳答案
这里发生的事情是,按钮的内部逻辑试图将发送者(一个 UIButton
)传递到您方法的 Date
参数中。但是,如果您的方法没有任何参数,则不会传递 sender 参数。
可选参数在这种情况下实际上不起作用。但是,您可以为 goToNextScreen
创建另一个无参数重载:
@objc func goToNextScreen() {
goToNextScreen(selectedDate: nil)
}
并改变
btn.addTarget(self, action: #selector(goToNextScreen), for: .touchUpInside)
到
btn.addTarget(self, action: #selector(goToNextScreen as () -> Void), for: .touchUpInside)
所以它在两个重载之间是不同的。
请注意,为什么只写 #selector(goToNextScreen)
是有歧义的,因为您有两个名为 goToNextScreen
的方法,而 Swift 需要解析其中之一。但它不能只用名字。这是一个类似的情况:
class Foo {
@objc func f() {}
func f(x: Int) {}
let selector: Selector = #selector(f) // ambiguous use of f
}
编辑:如果不创建另一种方法,您就无法真正做到这一点。选择器是不灵活的东西。
关于ios - UIButton 添加没有发件人的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56752994/