带有从另一个 class 调用的选择器的 UIGestureRecognizer
UIGestureRecognizer with selector being called from another class
我有两个 class 都添加了 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
场景后, Level1
中的 handlePinchFrom
方法被正常调用。但是,GameScene
中的 handlePinchFrom
方法在 Level1
中执行捏合手势时仍会被调用,即使 GameScene
不再出现在调试视图层次结构中。
同样,如果用户随后离开 Level1
并转换回 GameScene
,则当您执行捏合手势时,也会调用 Level1
中的 handlePinchFrom
方法在 GameScene
.
我猜这可能是因为两个选择器使用了相同的名称 (handlePinchFrom)。但是我尝试给其中一个选择器取一个不同的名称,但当我希望只调用其中一个时,它们仍然会被调用。
有谁知道为什么 GameScene
中的 handlePinchFrom
方法在加载 Level1
后仍然会被调用,即使程序不再是 运行 [=13] =] class?
感谢 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!) }
}
}
我有两个 class 都添加了 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
场景后, Level1
中的 handlePinchFrom
方法被正常调用。但是,GameScene
中的 handlePinchFrom
方法在 Level1
中执行捏合手势时仍会被调用,即使 GameScene
不再出现在调试视图层次结构中。
同样,如果用户随后离开 Level1
并转换回 GameScene
,则当您执行捏合手势时,也会调用 Level1
中的 handlePinchFrom
方法在 GameScene
.
我猜这可能是因为两个选择器使用了相同的名称 (handlePinchFrom)。但是我尝试给其中一个选择器取一个不同的名称,但当我希望只调用其中一个时,它们仍然会被调用。
有谁知道为什么 GameScene
中的 handlePinchFrom
方法在加载 Level1
后仍然会被调用,即使程序不再是 运行 [=13] =] class?
感谢 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!) }
}
}