ios - 没有参数的swift4选择器函数

标签 ios swift

在我的新项目中,当我点击一个按钮时,它会从底部弹出一个菜单 View 。

enter image description here

和代码:

blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleDismiss)))

handleDismiss 函数:

@objc func handleDismiss(callback:(() -> ())?) {

        UIView.animate(withDuration: 0.3, animations: {
            self.blackView.alpha = 0
            //......
            }
        }) { (completed: Bool) in
            callback?()
        }
    }

然后我点击菜单 View 的 Cancel 单元格,使用 callback 参数调用 handleDismiss 函数。它正在工作。

if item.icon == "close" {
    handleDismiss(callback: {
        print("callback now")
    })
  }

但是如果我点击黑色 mask View (触发 action: #selector(handleDismiss))),就会出现如下错误:

enter image description here

有人知道吗?

最佳答案

通过选择器 连接一个 Action 时,您必须匹配预期的方法签名。您的处理程序方法 handleDismiss 有一个闭包参数,它与 UITapGestureRecognizer 期望的不兼容;在这种情况下,这是一个单一的手势识别器参数,或者没有参数。所以你必须添加第二个方法作为点击事件监听器并将调用转发给关闭处理程序:

@objc func didTapDismiss() {
  handleDismiss(callback: nil) // call your dismiss logic from the tap handler
}

您的解除处理程序代码可以保持原样(您可以删除不再需要的 @objc):

func handleDismiss(callback:(() -> ())?) {
  ...

连接点击监听器时,使用新的点击处理程序操作:

blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didTapDismiss)))

最后一点:我不知道你的确切用例,但你可能会通过使用点击手势识别器使事情变得过于复杂;您考虑过只使用 UIButton 吗?

关于ios - 没有参数的swift4选择器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48248472/

相关文章:

swift - 使用外部源动态创建 NSPopUpButton (项目数量)

ios - 删除UITableViewCell并与Plist同步

ios - 如何正确编码 URL 字符串

ios - 如何将数据从 TableViewCell 传递到 ContainerView?

iphone - 导航 Controller 上的后退按钮不会停止视频流 (IOS)

ios - 确定 UIImageView 花费的时间 'drawing' 的方法?

ios - AVFoundation人脸检测框架

swift - 如何动画 MKMapKit 注释删除

ios - 分割 View Controller 序列和连接

ios - Mac/iOS 应用程序中中介者模式的实现 (Swift)