2017-12-31 64 views
0

두 클래스 모두 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. 
    } 
} 

GameScenehandlePinchFrom에서, 방법은 일반적으로 불린다. 사용자가 GameScene에서 Level1 장면으로 전환하면 Level1handlePinchFrom 메서드가 정상적으로 호출됩니다. 그러나 GameScenehandlePinchFrom 메서드는 이 더 이상 디버그 뷰 계층 구조에 나타나지 않더라도 Level1에서 집기 제스처를 수행 할 때도 계속 호출됩니다. 사용자가 다시 GameScene-Level1 및 전환 잎 경우 GameScene에서 핀치 제스처를 수행 할 때

마찬가지로, Level1에서 handlePinchFrom 방법은라고도지고 있습니다.

두 선택기 모두에 동일한 이름 (handlePinchFrom)을 사용했기 때문일 수 있습니다. 그러나 선택기 중 하나에 다른 이름을 지정하려고 시도했는데 둘 중 하나만 호출하면이 둘 모두 호출됩니다.

프로그램이 더 이상 GameScene 클래스를 실행하는 경우에도 GameScene에서 handlePinchFrom 방법은 여전히 ​​Level1을로드 한 후 호출 할 왜 사람이 알고 있나요?

+0

즉, 당신이보기 컨트롤러에 옵저버를 추가했습니다 그것을 제거하지 않기 때문에 분명히이다 "누군가 GameScene에서 handlePinchFrom 방법은 여전히 ​​호출 할 이유를 알고 있나요." –

+1

@ElTomato'# selector '를 사용하여 Swift에서 Objective-C 기능을 사용하는 방법을 알았습니다. 나는 Obj-C에 익숙하지 않다는 것을 고백한다. 내가 장면에서 벗어나면 선택기가 제거 될 것이라고 생각했습니다. 장면을 떠나기 전에 선택기를 명시 적으로 제거해야합니까? – peacetype

+2

제스처 인식기가'view'에 추가되었고 당신은'Level1' 장면에서 같은 뷰를 사용하고 있습니다. 'willMove (from view :)'에서'view.removeGestureRecognizer (...)'를 사용하여 오래된 인식기를 제거해야합니다. – 0x141E

답변

0

0x141E의 제안 덕분에 코드가 수정되었습니다. 아래에서 내 업데이트 된 코드를 참조하십시오.

제스처 인식기를 설정하고 didMove(to view:)에 대한 참조를 가져옵니다. 그런 다음 참조를 사용하여 willMove(from view:)의 장면보기에서 제거합니다.

제스처 인식기는 내 앱이 게임 장면을 떠난 후에 더 이상 호출되지 않습니다.