在我的新项目中,当我点击一个按钮时,它会从底部弹出一个菜单视图。
和代码:
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))
),则会出现如下错误:
有没有人有想法?
答案 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对象作为参数。 您无法定义动作功能以获取所需的任何参数。