【问题标题】:swift4 selector function without parametersswift4选择器函数不带参数
【发布时间】:2018-06-23 05:26:55
【问题描述】:

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

和代码:

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?()
        }
    }

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

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

但如果我点击黑色蒙版视图(触发action: #selector(handleDismiss))),则会出现如下错误:

有人知道吗?

【问题讨论】:

  • 是的,因为 blackview 具有点击手势和 UIGestureRecognizer 的必需发送者对象和 IBAction。所以你必须使用 UIGestureRecognizer 的发送者创建一个新函数并从中调用 handleDismiss。

标签: ios swift


【解决方案1】:

通过selector 连接操作时,您必须匹配预期的方法签名。您的处理程序方法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

【讨论】:

    【解决方案2】:

    处理手势的函数必须定义如下。

    @IBAction func myActionMethod(_ sender: UIGestureRecognizer)
    

    当 UITapGestureRecognizer 调用控制器中的动作函数时,它会将 UIGestureRecognizer 对象作为参数传递。 你不能定义动作函数来获取你想要的任何参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多