所以几年前我创建了一个非常简单的自定义NavigationController,当然它是UINavigationController的子类,它覆盖的唯一方法是
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
在其中我展示了一个UIAlertView,要求用户确保他们想要回去。当他们选择是时,它会使用
返回[self popViewControllerAnimated:YES];
除了iOS 7使用新的从左到右滑动手势回到上一个屏幕时,一切正常。 它正确地返回到上一个屏幕,但顶部导航栏不会改变。
例如,如果我在主屏幕上并单击Row1。视图将更改,导航栏将显示Row1作为标题和'<返回左上方的“按钮”。
点击'<后退'按钮按预期工作100%。
如果我从左向右滑动返回,视图将返回到我的主屏幕,但导航栏仍将显示'<返回'按钮'和'Row1'作为标题。
我尝试使用UINavigationController而不是我的自定义类,它的子类和滑动功能正常工作,所以我知道这就是问题所在。我必须在我的自定义类
中错过一个电话或其他内容有什么想法吗?
谢谢!
编辑:
我刚刚编辑了我的CustomNavigation代码,它现在似乎有效。当使用左上方的Back按钮由于某种原因,shouldPopItem被调用了两次,所以我有一些代码使它能够在iOS 6及更低版本下正常工作。 当使用滑动手势时,我注意到它只被调用一次并且我第一次弹出控制器但返回NO(这就是导航栏没有改变的原因)。我现在检查iOS 7并立即返回YES以解决问题,现在可以正常工作。
答案 0 :(得分:0)
navigationBar:shouldPopItem:
是UINavigationBar上的委托方法,UINavigationController实现了该方法。所以你所做的就是阻止导航栏弹出UINavigationItem
。这就是为什么当你覆盖它时,它会阻止导航栏删除与弹出的UIViewController
相关联的项目。它实际上不应该阻止导航控制器弹出视图控制器,它可能只是旧实现的一个副作用,使其正常工作。他们要么改变了一些东西,要么在使用手势时它的工作原理只是有区别,这使得这个黑客不再正常工作。无论如何,通常你不应该能够阻止后退按钮返回。如果要呈现需要某种确认返回的屏幕,或者要先完成或取消任务,则应该提供模态视图控制器。否则,您可以用自己的替换默认后退按钮并隐藏正常的后退按钮。然后你的自定义按钮(除非你做了很多工作,看起来会有所不同)可以调用自定义方法来提示。
当然,如果你坚持使用UINavigationController
,你会想要禁用平移手势。 UINavigationController
上有一个属性可以获取手势识别器:
@property(nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer NS_AVAILABLE_IOS(7_0);
您可以将其停用,以便它不再让您返回。