要清楚,我需要一些明确的方法,在控制器将被这个手势识别器弹出之前,在最上面的控制器(而不是其他)上被调用.我不想在导航控制器上获取事件,并将事件发送到相应的控制器,我不想使用viewWillAppear或viewWillDissapear …
我最近的事情是添加一个目标/选择对对手势只有2个问题.首先,如果控制器被关闭,UGestureRecognizerStateEnded将在任何情况下都会触发,我无法得到直接信息.在控制器被关闭之后,我需要从识别器中删除目标.
原因是我有几个控制器需要向他们的代表发送一些信息.通过“完成”和“取消”按钮触发事件,委托方法被调用,然后弹出控制器.我需要几乎相同的情况发生,尽可能少的更改代码.
这种手势的另一种情况是投掷警报视图和恢复动作的可能性:当这个手势结束询问时,是否有一种显示警报视图的方法,如“你确定要取消你的工作”,并让用户选择控制器将被弹出或带回来.
解决方法
Objective-C的
– (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
迅速
func navigationController(navigationController: UINavigationController,willShowViewController viewController: UIViewController,animated: Bool)
所以实现会看起来像这样.
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]); }]; }
迅速
func navigationController(navigationController: UINavigationController,animated: Bool) { if let coordinator = navigationController.topViewController?.transitionCoordinator() { coordinator.notifyWhenInteractionEndsUsingBlock({ (context) in print("Is cancelled: \(context.isCancelled())") }) } }
当用户抬起手指和(Objec-C)[context isCancelled]时,回调将触发; (Swift)context.isCancelled()将返回YES / true,如果动画被反转(视图控制器没有弹出),否则为NO / false.在上下文中有更多的东西可以被使用,就像两个视图控制器相关的,以及在发布时完成的动画的百分比.