UINavigationBar:拦截返回按钮和返回滑动手势

5
我有一个UINavigationBar,它拦截了后退按钮的点击事件,并提示用户是否有未保存的更改。这是基于UINavigationController and UINavigationBarDelegate.ShouldPopItem() with 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];
    }
}

虽然这样可以弹出视图,但它会保留导航栏按钮,因此我最终得到的是一个指向空白页面的返回按钮,以及我添加到导航栏的所有其他导航按钮。有什么建议吗?

1个回答

11

要拦截返回手势,您可以将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;
}
在警报中,您可以询问用户是否仍要返回,如果是,则在alertView clickedButtonAtIndex:中弹出控制器。
希望这能有所帮助。

我本来以为如果我改变手势识别器的委托,会出现一些问题,但是目前还没有看到任何问题。默认的委托是_UINavigationInteractiveTransition类的一个对象。我将其更改为我的自定义UINavigationController子类,并且似乎工作正常。 - arlomedia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接