没有参数的swift4选择器功能

时间:2018-01-14 10:01:40

标签: ios swift

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

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

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

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

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

enter image description here

有没有人有想法?

2 个答案:

答案 0 :(得分:5)

通过UITapGestureRecognizer连接操作时,您必须匹配预期的方法签名。您的处理程序方法@objc func didTapDismiss() { handleDismiss(callback: nil) // call your dismiss logic from the tap handler } 具有一个与@objc期望的内容不兼容的闭包参数;在这种情况下,单个手势识别器参数,或没有参数。所以你必须添加第二个方法作为tap事件监听器并将调用转发给dismiss处理程序:

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

您的解雇处理程序代码可以保持不变(您可以删除不再需要的blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didTapDismiss))) ):

UIButton

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

 <div class="col-md-12">
 <div class="row">
  <!-- ng-repeat stuff goes here !-->
 </div>
 </div>

最后一点:我不知道你的确切用例,但你可能会因使用轻敲手势识别器而使事情过于复杂;您是否考虑过仅使用override the replace function

答案 1 :(得分:1)

必须如下所示定义处理手势的功能。

@IBAction func myActionMethod(_ sender: UIGestureRecognizer)

当UITapGestureRecognizer调用控制器中的动作函数时,它会传递UIGestureRecognizer对象作为参数。 您无法定义动作功能以获取所需的任何参数。