ios - UIButton 添加没有发件人的目标

标签 ios swift uibutton

我有一个 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/

相关文章:

ios - UIButton (IB) 中的属性 titleLabel 不尊重 setFont

ios - UIButton 在 UIImageView 下不可点击(swift)

ios - 如何使用 2 个 View 从 IOS 应用程序发送电子邮件?

arrays - 在 convenience init 中创建数组

javascript - 如何计算欧氏距离? (华硕)

iphone - UIButton标题与图片对齐查询

iOS 13.2 MKTileOverlay 偶尔不会渲染

ios - 向上滚动时折叠 View (iOS)

尽管处于 .limited 状态,iOS 14 仍会显示整个照片库

swift - NSMutableURLRequest cachePolicy 不工作