2016-09-15 10 views
7

:motionBegan : withEvent : 아이폰 OS에 AppDelegate에 호출하지 단순히이 방법을 구현하여 AppDelegate에에서 흔들림 움직임을 감지하는 데 사용 10

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { 
    NSLog(@"shake shake shake"); 
} 

아이폰 OS 8에서 잘 작동 9. 그러나이 '아무튼 더 이상 iOS 10에서 작동하지 않습니다. 나는 또한 추가하려고 시도했다.

- (BOOL)canBecomeFirstResponder { 
     return YES; 
} 

그러나 그것은 도움이되지 않았다. UIViewControllers 잘 작동합니다. iOS 10에서 뭔가가 변경되었거나 버그 일 뿐이습니까?

답변

-2

(모두) View Controller (들)에서 motionBegan 메서드를 무시해야합니다.

+0

보기 컨트롤러에서 정상적으로 작동하지만 문제가 아닙니다. AppDelegate에서 작동해야합니다. – almas

7

나는 당신과 같은 문제가있었습니다. AppDelegate에서 구현하는 대신, 이제 iOS 8-10에서 작동하는 UIWindow를 사용합니다. 아마도 이것은 당신에게도 도움이 될까요?

extension UIWindow { 

    override open var canBecomeFirstResponder: Bool { 
     return true 
    } 

    override open func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) { 
     if motion == .motionShake { 
      //logic here 
     } 
    } 
} 

더 깨끗하게하려면 응용 프로그램에서 특수 버전의 UIWindow를 설정할 수 있습니다.

+0

감사합니다. @jayjunck. 이 논리를 루트보기 컨트롤러로 이동하여 코드에서 수정했습니다. 많은 해결 방법이있을 것이라고 확신하지만 AppDelegate에서 작동하지 않는 이유는 여전히 설명하지 않습니다. AppDelegate는 UIResponder이므로 작동해야합니다 ... – almas

1

비슷한 문제가있어서 @jayjunck 님의 답변을했지만 Xcode가 Method does not override any method from its superclass을 던집니다. 제가

  • open 클래스 정의 모듈 접근 subclassable 밖에 액세스하고 신속한 3에서 motionBegan 기능

    extension UIWindow { 
    override open func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) { 
         super.motionBegan(motion, with: event) 
    
         guard motion == UIEventSubtype.motionShake else { 
          return 
         } 
    
         // Shake is detected 
        } 
    } 
    

    을 무시할 open으로 public 대체하여 고정. 열린 클래스 멤버는 정의 모듈 외부에서 액세스 가능하고 재정의 할 수 있습니다.

  • public 클래스는 액세스 할 수 있지만 정의 모듈 외부에서 하위 클래스화할 수는 없습니다. public 클래스 멤버는 액세스 할 수 있지만 정의 모듈 외부에서 재정의 할 수는 없습니다.