ios - UIGestureRecognizer 与从另一个类调用选择器

标签 ios swift sprite-kit uigesturerecognizer selector

我有两个类,它们都添加了 UIPinchGestureRecognizer 并使用选择器来处理响应手势的代码。注意:手势识别器委托(delegate)可能与此问题无关,但我将其包含在代码中,以防万一。

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 方法将正常调用。但是,在 Level1 中执行捏合手势时,仍然会调用 GameScene 中的 handlePinchFrom 方法,即使 GameScene > 不再出现在调试 View 层次结构中。

同样,如果用户随后离开 Level1 并转换回 GameScene,则来自 Level1handlePinchFrom 方法当您在 GameScene 中执行捏合手势时也会调用。

我猜测这可能是由于两个选择器使用相同的名称(handlePinchFrom)造成的。但我尝试为其中一个选择器指定一个不同的名称,当我期望只调用其中一个选择器时,它们仍然会被调用。

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

最佳答案

感谢 0x141E 的建议,我修复了我的代码。请参阅下面我更新的代码。

我设置了手势识别器,并在 didMove(to view:) 中获取对它的引用。然后,我使用该引用将其从 willMove(from view:) 中的场景 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!) }
    }
}

关于ios - UIGestureRecognizer 与从另一个类调用选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48039616/

相关文章:

ios - 调整 SKPhysicsBody 边缘的大小并让 children 在里面

swift - SKPhysicsBody 提高 CPU 使用率

ios - NSOperation 队列与 NSUrlConnection 异步

ios - for in 循环在内部是如何工作的 - Objective C - Foundation

ios - 如何防止物理体改变 Sprite Kit 中的 x 位置

Swift - 为什么我的应用程序在这种情况下发现 nil

iOS Swift 4 - Twitter 登录按钮不执行任何操作 - 返回线程 1 Sigabrt,没有堆栈跟踪

ios - 如何在循环中快速将值插入多维数组

ios - 为什么 admob 插页式广告不显示在 iOS 上?

ios - 如何使用自定义图像在 SKScene 中制作边框