我有一个视图,其中我想执行向右滑动手势。错误EXC_BAD_ACCESS有人知道这里出了什么问题吗?请看下面的代码。
extension UIView {
func addGestureRecognizerWithAction(nizer: UIGestureRecognizer, action:() -> ()) {
class Invoker {
var action:() -> ()
init(action:() -> ()) {
self.action = action
}
func invokeTarget(nizer: UIGestureRecognizer) {
self.action()
println("Hi from invoker")
}
}
addGestureRecognizer(nizer)
nizer.addTarget(Invoker(action), action: "invokeTarget:")
}
}
class BugView: UIView {
override func awakeFromNib() {
super.awakeFromNib()
var swipeRight = UISwipeGestureRecognizer()
swipeRight.direction = UISwipeGestureRecognizerDirection.Right
self.addGestureRecognizerWithAction(swipeRight) {
println("Hi from the gesture closure")
}
}
}
5条答案
按热度按时间wribegjk1#
对于那些不喜欢关联对象和其他坚韧的东西,我有一个小的手势识别器,不需要任何喧嚣。它不需要存放在某个地方。像普通的GR一样工作。虽然它有一些限制-它继承自
UITapGestureRecognizer
,他只知道如何处理水龙头。但我们是否经常需要所有的类型呢?我个人不喜欢。用法示例:
万一出现了一些更有意义的台词,别忘了【弱我】。我们可不想创造出那些不死的伙伴。
对我来说,从那些
@objc
一行程序中净化我们的视图控制器并变得更..React性?goqiplq22#
这里是imho最简单的解决方案,不需要子类化,所以它是相当通用的。但它需要关联的对象来存储动作:
这允许您甚至在自己的子类中使用following。用途:
xqk2d5yq3#
最后return true是对的。在上面的回答中,他建议将
Invoker
作为NSObject的子类,为我指出了正确的方向。但这不是我在代码中遇到的唯一错误。我发现,当滑动发生时,用于处理事件的
Invoker
对象已经从内存中消失了。我认为对它的引用并没有像它应该的那样被关闭所捕获。现在我想出了另一种实现此功能的方法,我想与您分享:下面的代码片段展示了如何使用该代码:
yzuktlbb4#
这里有一个Swift 4.2的方法,基于@user1755189的答案,但我认为它更容易调用。首先添加以下类:
然后你可以像这样添加一个UITapGestureRecognizer:
nbewdwxp5#
这是我的UIGestures的ClosureActionsHandler。我已经为UIView扩展了这个,所以你可以在所有的UIComponent上实现。这是Git-link。Happy Coding很棒的极客们。