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

Posted

技术标签:

【中文标题】创建自定义 UINavigationController - 使用 iOS 7 滑动手势无法正常工作【英文标题】:Created custom UINavigationController - using the iOS 7 swiping gesture doesn't work properly 【发布时间】:2014-01-10 22:03:28 【问题描述】:

所以几年前我创建了一个非常简单的自定义 NavigationController,当然它是 UINavigationController 的子类,它覆盖的唯一方法是

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item 

在其中我显示了一个 UIAlertView,要求用户确保他们想要返回。当他们选择是时,它会使用

返回
[self popViewControllerAnimated:YES];

使用新的从左向右滑动手势返回上一个屏幕时,除了 ios 7 之外,一切正常。 它正确地返回到上一个屏幕,但顶部导航栏没有改变。

例如,如果我在主屏幕上单击第 1 行。视图将发生变化,导航栏将显示第 1 行作为标题,并在左上角显示一个“

单击“

如果我从左向右滑动返回,视图将返回到我的主屏幕,但导航栏仍将显示“

我尝试只使用 UINavigationController 而不是我的自定义类,它子类化并且滑动功能正常工作,所以我知道这就是问题所在。我必须在我的自定义类中错过一个电话或其他东西

有什么想法吗?

谢谢!

编辑:

我刚刚稍微编辑了我的 CustomNavigation 代码,现在它似乎可以工作了。当出于某种原因使用左上角的后退按钮时,shouldPopItem 被调用了两次,所以我有一些代码让它在 iOS 6 及更低版本中正常工作。 使用滑动手势时,我注意到它只被调用一次,而且我第一次弹出控制器但返回 NO(这就是导航栏没有改变的原因)。我现在检查 iOS 7 并立即返回 YES,这解决了问题并且现在可以正常工作。

【问题讨论】:

【参考方案1】:

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

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

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

您可以禁用它,这样它就不会再让您返回。

【讨论】:

以上是关于创建自定义 UINavigationController - 使用 iOS 7 滑动手势无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

使 uipagecontrol 动画看起来像 uinavigationcontrol 动画

Mysql 创建自定义函数

创建QGis的自定义DataProvider

创建自定义视图的步骤

vue创建自定义组件并监听原生事件

创建自定义事件