【问题标题】:In iOS7, abnormal popping action of UINavigationController with edge swipingiOS7中,UINavigationController的边缘滑动异常弹出动作
【发布时间】:2014-01-23 02:13:51
【问题描述】:

我在 UINavigationController 中使用边缘滑动弹出视图控制器 (VC) 时发现了一个看起来像 iOS7 的错误。

我设置如下 VC 层次结构:

UINagivationController
  |
  --- UIVewControllerR (root)
            |
            --- UIViewControllerA
                      |
                      --- UIViewControllerB  

我尝试通过边缘滑动弹出 UIViewControllerB 并不断弹出 UIViewControllerA。它运作良好。但是,如果第一次刷卡操作被取消然后重试弹出,我发现的一个错误就出来了。弹出 UIViewControllerA 后,我发现 UIViewControllerA 的导航栏项尽管弹出 UIViewControllerA 仍然显示。

简而言之,UIViewControllerR 与 UIViewControllerA 的导航栏项目一起显示。

没有可能影响 UINavigationController 转换的代码。
是iOS7的bug吗?

【问题讨论】:

  • 所以,你开始刷 B,然后取消。然后回到A,再回到R,当你回到R时,导航栏仍然显示A的东西?
  • @nhgrif 是的。返回时不是返回按钮而是边缘滑动。
  • 但是我列出的顺序是准确的顺序吗?您能否将一个复制此错误的示例项目放在一起并将其发布在 github 上以及复制问题的确切说明?
  • @nhgrif 我发现我准确地写了这个问题。对不起我错过的问题。我会尽快修改。
  • 我也遇到了同样的问题。你找到解决办法了吗??

标签: ios objective-c ios7


【解决方案1】:

我找到了解决这个问题的方法。

我所做的是在我的 UINavigationController 类中,设置一个名为

的 BOOL 属性
@property (nonatomic, assign) BOOL interactivePopGestureComplete;

然后在那个 UINavigationController 的 init 中

self.interactivePopGestureComplete = YES;
    if([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
        [self.interactivePopGestureRecognizer addTarget:self action:@selector(defaultGestureAction:)];

和这样的操作方法:

- (void)defaultGestureAction:(UIGestureRecognizer *)sender
{
    if(sender.state == UIGestureRecognizerStateBegan || sender.state == UIGestureRecognizerStateChanged)
        self.interactivePopGestureComplete = NO;
    else
        self.interactivePopGestureComplete = YES;
}

在 viewWillAppear: 或 viewWillLayoutSubviews: 中(在有这个问题的 viewControllers 中),在这两个方法中的任何地方你要更新navigationBarButtons 和navigationBar,只要检查是否

// Lets say our UINagivationController class name is NavigationCon
NavigationCon *navCon = (NavigationCon *)self.navigationController;
if(navCon.interactivePopGestureComplete)
{
    // only then update navigationBar
} 

【讨论】:

  • 很抱歉最近提供反馈。我测试了你对我有问题的代码的建议。除了一部分之外,您的代码确实运行良好。 viewWillAppear: 和 viewWillLayoutSubviews: 在interactionGestureRecognizer 刚开始工作时被调用,这样在识别结束时不会调用两个函数。为了解决这个问题,我使用您建议我放置在 viewWillAppear: 中的相同代码覆盖了 viewDidAppear:。非常感谢您找到解决问题的方法。
【解决方案2】:

我能理解你面临的问题

有两种情况会发生。

1.您在哪里完成了所有控制器中的导航栏文本更改。如果您在 viewWillAppear 或 viewDidAppear 中完成了,那么可能会发生这种情况..您必须在 viewDidLoad 中完成

2.在过渡更改结束之前对导航栏进行更改。

如果对你有帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多