Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
取消iOS 7反向滑动手势后,导航堆栈变得不可用_Ios_Uinavigationcontroller_Ios7_Uinavigationbar - Fatal编程技术网

取消iOS 7反向滑动手势后,导航堆栈变得不可用

取消iOS 7反向滑动手势后,导航堆栈变得不可用,ios,uinavigationcontroller,ios7,uinavigationbar,Ios,Uinavigationcontroller,Ios7,Uinavigationbar,我遇到了一个问题,在启动然后取消新的iOS 7反向滑动手势后,我的导航控制器变得不可用 一些相关信息: 我的应用程序有一个带有各种活动页面的主页 主页将隐藏视图中的导航栏 主页取消隐藏视图中的导航栏将消失 -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Let's hide the navbar when we show the home view [self.na

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

一些相关信息:

  • 我的应用程序有一个带有各种活动页面的主页
  • 主页将隐藏视图中的导航栏
  • 主页取消隐藏视图中的导航栏将消失

    -(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中开始使用新的回刷手势,但随后停止该手势(即决定不回刷),则一切看起来都正常。但是,如果用户导致另一个视图控制器被推到导航堆栈上,则导航栏将变得不可用,并且用户无法从当前视图控制器返回

注释

  • 只有在显示/隐藏导航栏时才会发生这种情况
  • 我仍然可以慢慢地做背部姿势,只要我不取消这个姿势,一切都会很好
  • 导航栏似乎可以工作,但点击后退按钮不会弹出视图控制器

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

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

      所以这是可行的:

      [self.navigationController setNavigationBarHidden:YES animated:YES];
      ...
      [self.navigationController setNavigationBarHidden:NO animated:YES];
      
      但这并不是:

      [self.navigationController setNavigationBarHidden:YES animated:NO];
      ...
      [self.navigationController setNavigationBarHidden:NO animated:NO];
      
      如果出于任何原因确实希望动画设置为“否”,一种解决方法是将alpha设置为0/1,而不是隐藏/取消隐藏导航栏:

      - (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];
      }
      
      缺点是没有很好的幻灯片到弹出的过渡动画。如果你找到了更好的方法,一定要告诉我们

      更新:这已经过时了,但我解决了我的问题,没有确保在当前视图的视图中更改的任何状态都将消失,而在视图中恢复。不要在视图中删除无法再次设置的内容

      取消pop动画时会发生以下情况:


    • 当前视图将消失
    • 新视图将出现
    • [取消…反向]
    • 新的视图将消失
    • 新视野消失了
    • 将显示当前视图
    • 显示当前视图


    • 我想在这个美丽的新世界里,viewwilldefine/viewwillbefore并不总是意味着view“will”消失/出现:)

      我想我的解决方案可能会对你有所帮助

      让我们假设主页视图控制器的类是HomePageViewController(类名),而活动视图控制器也被称为ActivityViewController(类名)

      首先,在HomePageViewController的视图中将显示:

      - (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];
      }
      

      我通过使用第二视图控制器的
      视图中的
      动画:true
      将出现
      视图中的
      动画:false
      将消失
      解决了这个问题

      - (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;
              }
          }
      }
      

      虽然不是最好的解决方案,但我只是在隐藏和显示导航栏时禁用了切换的滑动手势控制:
      self.navigationController.interactiveepgestureerecognizer.enabled=NO谢谢你的建议。目前,我刚刚禁用了“向后滑动”功能。我不想让用户感到困惑;不知道刷卡何时/为什么在某些区域有效,而在其他区域无效。这为我解决了问题。非常感谢。这解决了这个问题,但在缺点方面,状态栏仍然认为导航控制器在它后面。如果导航控制器为暗色且主视图内容为浅色,则状态栏文本为白色(亮/白背景)。如果导航栏是用setNavigationBarHidden隐藏的,状态栏文本会在浅色背景上正确地切换为黑色。您最初的建议有效,但我不明白您的更新意味着什么。为什么
      [self.navigationController setnavigationbar隐藏:否动画:是]还原状态,但
      [self.navigationController setnavigationbar隐藏:无动画:无]不会?@Tree Hugger-在“更新:这已经很旧了,但我没有确保……”中的“不是”是一个错误吗?看起来您确实想确保,但正如所写,您是说您不想确保……这不一定有效-
      viewwillbeen
      在取消手势时不会被调用,以我的经验来看。(iOS 11)