UINavigationBar:拦截后退按钮和后退滑动手势

Ger*_*eon 3 back uinavigationbar swipe ios

我有一个UINavigationBar拦截后退按钮点击,如果有未保存的更改,它会提醒用户.这是基于UINavigationController和UINavigationBarDelegate.ShouldPopItem()与MonoTouch使用UINavigationBarDelegate协议和实现的解决方案.- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item;

现在,iOS7已经引入了向后移动的手势,我也想拦截它,但是无法使用我迄今为止发现的解决方案,即使用[self.interactivePopGestureRecognizer addTarget:self action:@selector(handlePopGesture:)];

- (void)handlePopGesture:(UIGestureRecognizer *)gesture {
    if (gesture.state == UIGestureRecognizerStateEnded) {
        [self popViewControllerAnimated:NO];
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这确实会弹出视图,但它会使导航栏按钮保持原位,所以我最终会得到一个无处可用的后退按钮,以及我添加到导航栏的所有其他导航按钮.有小费吗?

val*_*fer 7

要拦截后滑动手势,您可以将其设置self为手势(<UIGestureRecognizerDelegate>)的委托,然后gestureRecognizerShouldBegin根据未保存的更改返回YES或NO :

// in viewDidLoad
self.navigationController.interactivePopGestureRecognizer.delegate = self;

// ...
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if ([gestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {

        if (self.dirty) {
            // ... alert
            return NO;
        } else
            return YES;
    } else 
        return YES;
}
Run Code Online (Sandbox Code Playgroud)

在警报中,您可以询问用户是否还想要返回,在这种情况下,请将控制器弹出 alertView clickedButtonAtIndex:

希望这个对你有帮助.