2016-09-15 23 views
7

tôi đã sử dụng để phát hiện một chuyển động lắc từ appdelegate bằng cách đơn giản thực hiện phương pháp này:motionBegan: withEvent: không được gọi trong appdelegate trong iOS 10

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

mà hoạt động tốt trong iOS 8 và 9. Tuy nhiên nó doesn' t làm việc trong iOS 10 nữa. Tôi cũng đã thử thêm

- (BOOL)canBecomeFirstResponder { 
     return YES; 
} 

nhưng điều đó không hữu ích. Điều này hoạt động tốt trong UIViewControllers mặc dù. Đã có điều gì đó thay đổi trong iOS 10 hay chỉ là một lỗi?

Trả lời

-2

Bạn nên ghi đè phương thức motionBegan trong (tất cả) Xem (các) trình điều khiển.

+0

Nó hoạt động tốt trong bộ điều khiển chế độ xem, nó không phải là vấn đề. Tôi cần nó để làm việc trong AppDelegate. – almas

7

Tôi gặp vấn đề tương tự như bạn. Thay vì triển khai nó trên AppDelegate, bây giờ tôi sử dụng UIWindow, nó hoạt động với tôi trong iOS 8-10. Có lẽ đây là do-có thể cho bạn là tốt?

extension UIWindow { 

    override open var canBecomeFirstResponder: Bool { 
     return true 
    } 

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

Nếu bạn muốn làm điều này thậm chí còn sạch hơn, bạn có thể đặt phiên bản chuyên biệt của UIWindow trên ứng dụng.

+0

Cảm ơn @jayjunck. Tôi cố định nó trong mã của tôi bằng cách di chuyển logic này vào bộ điều khiển xem gốc. Tôi chắc rằng có rất nhiều cách giải quyết, nhưng họ vẫn không giải thích tại sao nó không hoạt động trong AppDelegate. AppDelegate là một UIResponder, vì vậy nó sẽ hoạt động ... – almas

1

Tôi gặp sự cố tương tự và tôi đã thử câu trả lời của @jayjunck nhưng Xcode đã ném Method does not override any method from its superclass. Tôi cố định nó bằng cách thay thế public với open để truy cập và ghi đè motionBegan chức năng

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 
    } 
} 

Trong Swift 3,

  • Một lớp open nằm ngoài tiếp cận và subclassable của module xác định. Một thành viên lớp mở có thể truy cập và có thể ghi đè bên ngoài mô-đun xác định.

  • Có thể truy cập được public lớp nhưng không thể phân lớp bên ngoài mô-đun xác định. Một thành viên lớp công khai có thể truy cập nhưng không thể ghi đè bên ngoài mô-đun xác định.

Các vấn đề liên quan