두 클래스 모두 UIPinchGestureRecognizer
을 추가하고 선택기를 사용하여 제스처에 응답하는 코드를 처리합니다. 참고 : 제스처 인식기 대리인은이 문제와 관련이 없을 것입니다. 다만이 경우 코드에 포함됩니다.다른 클래스에서 선택기를 호출하는 UIGestureRecognizer
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
방법은라고도지고 있습니다.
두 선택기 모두에 동일한 이름 (handlePinchFrom)을 사용했기 때문일 수 있습니다. 그러나 선택기 중 하나에 다른 이름을 지정하려고 시도했는데 둘 중 하나만 호출하면이 둘 모두 호출됩니다.
프로그램이 더 이상 GameScene
클래스를 실행하는 경우에도 GameScene
에서 handlePinchFrom
방법은 여전히 Level1
을로드 한 후 호출 할 왜 사람이 알고 있나요?
즉, 당신이보기 컨트롤러에 옵저버를 추가했습니다 그것을 제거하지 않기 때문에 분명히이다 "누군가 GameScene에서 handlePinchFrom 방법은 여전히 호출 할 이유를 알고 있나요." –
@ElTomato'# selector '를 사용하여 Swift에서 Objective-C 기능을 사용하는 방법을 알았습니다. 나는 Obj-C에 익숙하지 않다는 것을 고백한다. 내가 장면에서 벗어나면 선택기가 제거 될 것이라고 생각했습니다. 장면을 떠나기 전에 선택기를 명시 적으로 제거해야합니까? – peacetype
제스처 인식기가'view'에 추가되었고 당신은'Level1' 장면에서 같은 뷰를 사용하고 있습니다. 'willMove (from view :)'에서'view.removeGestureRecognizer (...)'를 사용하여 오래된 인식기를 제거해야합니다. – 0x141E