UIGestureRecognizer,从另一个类调用选择器

问题描述 投票:0回答:1

我有两个类,它们都添加了一个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中执行捏合手势时,来自Level1GameScene方法也会被调用。

我猜这可能是由两个选择器使用相同的名称(handlePinchFrom)引起的。但我尝试给其中一个选择器一个不同的名称,当我期望只调用其中一个时,它们仍会被调用。

有谁知道为什么handlePinchFromGameScene方法在加载Level1之后仍会被调用,即使程序不再运行GameScene类?

ios swift sprite-kit uigesturerecognizer selector
1个回答
0
投票

由于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!) }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.