2016-09-15 3 views
7

Я использовал для обнаружения движения встряхивания от AppDelegate просто реализаций этого метода:motionBegan: withEvent: не вызывается в AppDelegate в ИО 10

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

, который отлично работает в прошивке 8 и 9. Однако это Безразлично» t работать в iOS 10. Я также попытался добавить

- (BOOL)canBecomeFirstResponder { 
     return YES; 
} 

, но это не помогло. Однако это отлично работает в UIViewControllers. Что-то изменилось в iOS 10, или это просто ошибка?

ответ

-2

Вы должны переопределить motionBegan метод в (все) Просмотр контроллера (ов).

+0

Он отлично работает на контроллерах, это не проблема. Мне нужно, чтобы он работал в AppDelegate. – almas

7

У меня была такая же проблема, как и вы. Вместо того, чтобы внедрять его в AppDelegate, теперь я использую UIWindow, который работает для меня в iOS 8-10. Возможно, это тоже полезно для вас?

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 thrown Method does not override any method from its superclass. Я установил его, заменив public с open доступа и переопределить функцию 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 
    } 
} 

В Swift 3

  • open класс доступен и подклассы вне определяющего модуля. Открытый член класса доступен и переопределяется вне определяющего модуля.

  • Класс public доступен, но не подклассы за пределами определяющего модуля. Открытый член класса доступен, но не переопределяется вне определяющего модуля.

Смежные вопросы