【问题标题】:popToViewController, then pushViewControllerpopToViewController,然后是 pushViewController
【发布时间】:2011-11-18 16:13:26
【问题描述】:

在我的 rootViewController 之后,有一个像这样的工作流

viewController1 -> push viewController2 -> push viewController3 -> ***** viewController2

我想弹出ToViewController3。但是,我需要先去viewController1,因为viewController1基本上决定了要推送哪个viewController2的实例。所以我

// pseudo code
[popToViewController:vc1 animated:NO];
[self.navigationController pushViewController2 animated:YES];

我基本上在推送之前弹出,所以我最终不会得到 vc2、vc3、vc2、vc3、vc2 等。但是在这样做时,由于它动画最后一个 viewController 的推送,它给用户的印象是新的 viewController 被推入堆栈,而不是弹出到前一个 viewController。有没有办法解决这个问题?如果我为 pop 而不是最后一个 push 设置动画,则从外观上看,我没有得到我想要的正确 viewController。谢谢。

【问题讨论】:

    标签: iphone uiviewcontroller uinavigationcontroller


    【解决方案1】:

    你可以使用类似的东西

    [self.navigationController setViewControllers:[NSArray arrayWithObject:yourViewController] 
                                         animated:YES];
    

    您可以使用堆栈中所需的视图控制器填充数组。

    【讨论】:

      【解决方案2】:
      @interface UINavigationController (PushThenPop)
      -(void)popToViewController:(UIViewController*)rootViewController
          thenPushViewController:(UIViewController*)pushViewController;
      @end
      
      
      @implementation UINavigationController (PushThenPop)
      -(void)popToViewController:(UIViewController*)rootViewController
          thenPushViewController:(UIViewController*)pushViewController
      {
          NSMutableArray *viewControllers = self.viewControllers.mutableCopy;
      
          // Pop viewcontrollers until we reach the rootViewController
          while(viewControllers.count >= 1) {
              id last = [viewControllers lastObject];
              if (last == rootViewController) break;
              [viewControllers removeLastObject];
          }
      
          // Bail out the array is empty. We expect the array to contain at least 1 element, the rootViewController.
          if (!viewControllers.count) {
              return;
          }
      
          // Push the new view controller
          [viewControllers addObject:pushViewController];
          self.viewControllers = viewControllers.copy;
      }
      @end
      

      【讨论】:

        【解决方案3】:

        您可以检索 (viewControllers)、修改和“重新安装”(setViewControllers) 由导航控制器管理的视图控制器列表,并且“重新安装”可以(理论上)动画。 (不过,我在实践中遇到了一些动画问题,虽然我不记得细节了。)

        【讨论】:

          猜你喜欢
          • 2018-03-15
          • 1970-01-01
          • 1970-01-01
          • 2011-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多