28

我遇到了一个问题,即我的导航控制器在启动然后取消新的 iOS 7 向后滑动手势后变得无法使用。

一些相关信息:

  • 我的应用程序有一个包含各种活动页面的主页。
  • 主页在 viewWillAppear 中隐藏导航栏
  • 主页在 viewWillDisappear 中取消隐藏导航栏

    -(void) viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
    
        // Let's hide the navbar when we show the home view
        [self.navigationController setNavigationBarHidden:YES];
        …
    }
    
    -(void) viewDidDisappear:(BOOL)animated 
    {
        [super viewDidDisappear:animated];
    
        // Let's hide the navbar when we show the home view
        [self.navigationController setNavigationBarHidden:NO];
    }
    

当用户点击主页上的活动图标时,活动的视图控制器被推送到堆栈上。

如果用户开始在 iOS 中使用新的向后滑动手势,但随后停止手势(即决定不返回),一切看起来都正常。但是,如果用户导致另一个视图控制器被推送到导航堆栈上,那么导航栏将变得不可用,并且用户无法从当前视图控制器导航回来。

笔记

  • 仅当我显示/隐藏导航栏时才会发生
  • 我仍然可以慢慢执行后退手势,只要我不取消手势,一切都会正常进行
  • 导航栏似乎可以工作,但点击后退按钮不会弹出视图控制器。
4

5 回答 5

17

不确定您是否已经解决了这个问题,但我面临同样的问题,但有一个不同。仅当我将动画设置为 NO 时,导航堆栈才会混乱。

所以这有效:

[self.navigationController setNavigationBarHidden:YES animated:YES];
...
[self.navigationController setNavigationBarHidden:NO animated:YES];

但这不是:

[self.navigationController setNavigationBarHidden:YES animated:NO];
...
[self.navigationController setNavigationBarHidden:NO animated:NO];

如果您出于某种原因确实希望动画为 NO,一种解决方法是将 alpha 设置为 0/1,而不是隐藏/取消隐藏 NavigationBar:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.navigationController.navigationBar.alpha = 0.0f;
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.navigationController.navigationBar setAlpha:1.0f];
}

缺点是没有漂亮的幻灯片到弹出的过渡动画。如果您确实找到了更好的方法,请告诉我们。

更新:这现在已经过时了,但是我通过不确保当前视图的 viewWillDisappear 中更改的任何状态都在 viewWillAppear 中恢复来解决了我的问题。不要拆除 viewWillDisappear 中无法重新设置的东西。

这是取消弹出动画时发生的情况:


  1. 当前视图将消失
  2. 新视图将出现
  3. [取消...反转]
  4. 新视图将消失
  5. 新视图DidDisappear
  6. 当前视图将出现
  7. 当前视图DidAppear

我想在这个勇敢的新世界中,viewWillDisappear/viewWillAppear 并不总是意味着视图“将”消失/出现 :)

于 2014-02-08T22:40:28.097 回答
3

我认为我的解决方案可能会对您有所帮助。

假设您的主页视图控制器的类是 HomePageViewController(类名),活动视图控制器也称为 ActivityViewController(类名)

首先,在您的 HomePageViewController 的 viewWillAppear 中:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES];
}

其次,在您的 ActivityViewController 中,添加以下代码:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}

- (void)viewWillDisappear:(BOOL)animated
{
    //trick to fix navigationbar disappear problem that when UIScreenEdgePanGesture is happening.
    if ([self.navigationController.topViewController isKindOfClass:[HomePageViewController class]]) {
        [self.navigationController setNavigationBarHidden:YES animated:YES];
    } else {
        [self.navigationController setNavigationBarHidden:NO animated:YES];
    }
    [super viewWillDisappear:animated];
}
于 2014-04-17T04:59:31.510 回答
2

我遇到了同样的问题,四处搜索后,如果取消手势,您似乎无法收到通知。-shouldCancel手势识别器委托上没有,-willReshowViewController导航控制器上也没有。所以我有需要显示导航栏的视图控制器(即正在取消的控制器)设置self.navigationController.navigationBarHidden = NO-viewWillAppear. 这样当手势被取消并被-viewWillAppear调用时,导航栏将再次被取消隐藏。据我所知,这是在取消手势时让向后滑动手势和显示/隐藏导航栏都没有问题的唯一方法。

于 2013-12-23T03:26:56.310 回答
1

它将帮助您避免冻结应用程序。

- (void)navigationController:(UINavigationController *)navigationController
       didShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animate
{
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
    {
        if (self.navigationController.viewControllers.count > 1)
        {
            self.navigationController.interactivePopGestureRecognizer.enabled = YES;
        }
        else
        {
            self.navigationController.interactivePopGestureRecognizer.enabled = NO;
        }
    }
}
于 2018-11-29T07:51:48.573 回答
0

我能够通过使用第二个视图控制器的animated: trueinviewWillAppearanimated: falsein来解决这个问题viewWillDisappear

于 2017-02-22T21:30:12.513 回答