创建自定义UINavigationController - 使用iOS 7滑动手势无法正常工作

时间:2014-01-10 22:03:28

标签: ios ios7 uinavigationcontroller uinavigationbar

所以几年前我创建了一个非常简单的自定义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以解决问题,现在可以正常工作。

1 个答案:

答案 0 :(得分:0)

navigationBar:shouldPopItem:是UINavigationBar上的委托方法,UINavigationController实现了该方法。所以你所做的就是阻止导航栏弹出UINavigationItem。这就是为什么当你覆盖它时,它会阻止导航栏删除与弹出的UIViewController相关联的项目。它实际上不应该阻止导航控制器弹出视图控制器,它可能只是旧实现的一个副作用,使其正常工作。他们要么改变了一些东西,要么在使用手势时它的工作原理只是有区别,这使得这个黑客不再正常工作。无论如何,通常你不应该能够阻止后退按钮返回。如果要呈现需要某种确认返回的屏幕,或者要先完成或取消任务,则应该提供模态视图控制器。否则,您可以用自己的替换默认后退按钮并隐藏正常的后退按钮。然后你的自定义按钮(除非你做了很多工作,看起来会有所不同)可以调用自定义方法来提示。

当然,如果你坚持使用UINavigationController,你会想要禁用平移手势。 UINavigationController上有一个属性可以获取手势识别器:

@property(nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer NS_AVAILABLE_IOS(7_0);

您可以将其停用,以便它不再让您返回。