2013-12-17 14 views
16

Có giải pháp sạch nào về việc gọi lại hoặc sự kiện trên bộ điều khiển chế độ xem bị loại bỏ (popped) theo số interactivePopGestureRecognizer không?Nhận tương tácPopGestureRecognizer loại bỏ gọi lại/sự kiện

Để rõ ràng, tôi cần một số phương thức rõ ràng được gọi trên bộ điều khiển cao nhất (và không có cách nào khác) trước khi bộ điều khiển được bật bởi trình nhận dạng cử chỉ này. Tôi không muốn nhận sự kiện trên bộ điều khiển điều hướng và gửi sự kiện đến bộ điều khiển thích hợp và tôi không muốn sử dụng viewWillAppear hoặc viewWillDissapear ...

Điều gần nhất tôi có là thêm cặp mục tiêu/bộ chọn cử chỉ chỉ có 2 vấn đề. Trước tiên, tôi không thể nhận được thông tin trực tiếp nếu bộ điều khiển sẽ bị loại bỏ hay không (UIGestureRecognizerStateEnded sẽ kích hoạt trong mọi trường hợp). Thứ hai sau khi bộ điều khiển được loại bỏ tôi cần phải loại bỏ các mục tiêu từ người nhận ra.

Lý do cho điều này là tôi có một vài bộ điều khiển cần gửi một số thông tin cho đại biểu của họ. Với các nút "thực hiện" và "hủy", sự kiện được kích hoạt, các phương thức ủy nhiệm sẽ được gọi và sau đó bộ điều khiển sẽ xuất hiện. Tôi cần khá nhiều điều tương tự để xảy ra với ít nhất là thay đổi mã càng tốt.

Một tình huống khác trên cử chỉ này là khả năng ném cảnh báo và hoàn nguyên hành động: Có cách hiển thị cảnh báo khi cử chỉ này kết thúc hỏi "bạn có chắc chắn muốn hủy công việc của mình" và có người dùng không chọn nếu bộ điều khiển sẽ được bật hoặc đưa trở lại.

+0

Sự cố thú vị. Tôi có cảm giác bạn cần phải tắt 'interactivePopGestureRecognizer' và đăng ký của riêng bạn hoặc sử dụng [chuyển đổi tương tác] của iOS 7 (http://www.objc.io/issue-5/view-controller-transitions.html) –

+0

Tôi sợ bạn có thể đúng. Có vẻ kỳ lạ đây không phải là một vấn đề phổ biến. Tôi mong đợi một vài ứng dụng cần phải thực hiện điều này ít nhất tại một số điểm.Điều tồi tệ nhất về việc thực hiện quá trình chuyển đổi tùy chỉnh là bạn phải vô hiệu hóa một cách rõ ràng cử chỉ trên mỗi bộ điều khiển đó và có thể bật lại nó sau khi được bật (hoặc một lần khác được đẩy). –

Trả lời

38

Tôi biết điều này là cũ nhưng đối với bất kỳ ai khác có thể đang gặp phải sự cố tương tự. Đây là cách tiếp cận tôi đã sử dụng. Trước tiên, tôi đăng ký UINavigationControllerDelegate vào bộ điều khiển điều hướng của mình. Các đại biểu cần phải thực hiện.

Objective-C

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

Swift

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) 

Vì vậy, việc thực hiện sẽ giống như thế này.

Objective-C

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
     id<UIViewControllerTransitionCoordinator> tc = navigationController.topViewController.transitionCoordinator; 
     [tc notifyWhenInteractionEndsUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> context) { 
      NSLog(@"Is cancelled: %i", [context isCancelled]); 
    }]; 
} 

Swift

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
    if let coordinator = navigationController.topViewController?.transitionCoordinator() { 
     coordinator.notifyWhenInteractionEndsUsingBlock({ (context) in 
      print("Is cancelled: \(context.isCancelled())") 
     }) 
    } 
} 

Các callback sẽ cháy khi người dùng nâng ngón tay cô và (objec-C) [context isCancelled]; (Swift) context.isCancelled() sẽ trở lại YES/true nếu hoạt ảnh bị đảo ngược (bộ điều khiển chế độ xem không được bật), khác NO/false. Có nhiều nội dung trong số context có thể được sử dụng, như cả bộ điều khiển chế độ xem và tỷ lệ phần trăm của hoạt ảnh được hoàn thành khi phát hành, v.v.

+1

Nó không phù hợp với "Tôi không muốn để có được sự kiện trên bộ điều khiển chuyển hướng và gửi sự kiện cho bộ điều khiển thích hợp" nhưng vẫn còn khá tốt. –

+1

Có tôi biết nó không hoàn hảo cho bạn nhưng câu hỏi của bạn là một trong những câu hỏi đầu tiên nếu bạn cố gắng google loại vấn đề này để nó có thể làm việc cho một số. Và về mặt kỹ thuật bạn không nhận được điều này trên bộ điều khiển chuyển hướng nhưng trên đại biểu, nhưng có bạn vẫn cần phải gọi một phương pháp trên bộ điều khiển. Nếu bạn muốn thử nó, bạn có thể sử dụng isCancelled để kiểm tra xem bạn có muốn thông báo hay không và sau đó sử dụng [context viewControllerForKey: UITransitionContextFromViewControllerKey] để có được bộ điều khiển để thông báo. Nhưng một lần nữa bạn đúng, nó không phải là những gì bạn aced cho. –

+1

Thực tế là có bộ điều khiển cao nhất tôi có thể thực hiện một cái gì đó như thế này: if ([tc respondsToSelector: @selector (controllerDismissedByPopGesture :)]) { [tc performSelector: @selector (controllerDismissedByPopGesture :) withObject: @ ([context isCancelled ])]; } Mặc dù tôi không thích loại mã này lắm nhưng nó thực hiện chính xác những gì tôi cần. Tất cả những gì tôi cần là thêm '- (void) controllerDismissedByPopGesture: (NSNumber *) isCancelled' vào BẤT CỨ điều khiển và tôi đã hoàn thành. Có lẽ bạn nên thêm nó vào câu trả lời của bạn ... –

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