UIGestureRecognizer,从另一个类调用选择器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UIGestureRecognizer,从另一个类调用选择器相关的知识,希望对你有一定的参考价值。
我有两个类,它们都添加了一个UIPinchGestureRecognizer
并使用一个选择器来处理响应该手势的代码。注意:手势识别器委托可能与此问题无关,但我将其包含在代码中以防万一。
class GameScene: SKScene, UIGestureRecognizerDelegate {
override func didMove(to view: SKView) {
let pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(handlePinchFrom))
pinchGestureRecognizer.delegate = self
self.view!.addGestureRecognizer(pinchGestureRecognizer)
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
@objc func handlePinchFrom(_ rec: UIPinchGestureRecognizer) {
// This method should only be called when pinching in GameScene scene.
}
}
class Level1: SKScene, UIGestureRecognizerDelegate {
// Same code here as in GameScene class.
@objc func handlePinchFrom(_ rec: UIPinchGestureRecognizer) {
// This method should only be called when pinching in Level scene.
}
}
在GameScene
中,handlePinchFrom
方法被正常调用。用户从GameScene
过渡到Level1
场景后,handlePinchFrom
中的Level1
方法正常被调用。然而,handlePinchFrom
中的GameScene
方法在Level1
中执行捏合手势时仍然被调用,即使GameScene
不再出现在Debug View Hierarchy中。
同样,如果用户然后离开Level1
并转换回GameScene
,那么当您在handlePinchFrom
中执行捏合手势时,来自Level1
的GameScene
方法也会被调用。
我猜这可能是由两个选择器使用相同的名称(handlePinchFrom)引起的。但我尝试给其中一个选择器一个不同的名称,当我期望只调用其中一个时,它们仍会被调用。
有谁知道为什么handlePinchFrom
的GameScene
方法在加载Level1
之后仍会被调用,即使程序不再运行GameScene
类?
由于0x141E的建议,我修复了我的代码。请参阅下面的更新代码。
我设置了手势识别器,并在didMove(to view:)
中获取对它的引用。然后我使用引用将它从willMove(from view:)
中的场景视图中删除。
现在,在我的应用离开游戏场景后,手势识别器不再被调用。
class GameScene: SKScene {
var pinchGrRef: UIPinchGestureRecognizer?
override func didMove(to view: SKView) {
let pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(handlePinchFrom))
self.view!.addGestureRecognizer(pinchGestureRecognizer)
self.pinchGrRef = pinchGestureRecognizer
}
@objc func handlePinchFrom(_ rec: UIPinchGestureRecognizer) {
// Respond to pinch gesture
}
override func willMove(from view: SKView) {
if pinchGrRef != nil { self.view!.removeGestureRecognizer(pinchGrRef!) }
}
}
以上是关于UIGestureRecognizer,从另一个类调用选择器的主要内容,如果未能解决你的问题,请参考以下文章
Swift Playgrounds 中的 UIGestureRecognizer
Swift:使 UIGestureRecognizer 只影响一个 UICollectionViewCell 而不是全部