【问题标题】:Switching to an arbitrary view using `UINavigationController`使用 `UINavigationController` 切换到任意视图
【发布时间】:2014-10-20 06:24:01
【问题描述】:

我有一个使用 UINavigationController 的 iPhone 应用程序,它是这样创建的:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Create navigation controller and initialize it with the menu view controller.
    navigationController = [[UINavigationController alloc] initWithRootViewController:[[MenuViewController alloc] init]];
    navigationController.navigationBar.hidden = YES;
    navigationController.toolbar.hidden = YES;

    // Create main window and initialize it with navigation view controller.
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [window setRootViewController:navigationController];
    [window makeKeyAndVisible];
    return YES;
}

从那里开始,事情通常会按类似于以下的顺序发生:

  1. 推送SelectDifficultyViewController
  2. 推送GameViewController
  3. 推送GameOverViewController
  4. 弹出到根目录 (MenuViewController)

我将如何切换到GameViewController 的新实例,而不是在第 4 步中弹出到根目录。

我目前有以下内容,但它只是让我回到根目录:

[self.navigationController popToRootViewControllerAnimated:NO];
[self.navigationController pushViewController:[[GameViewController alloc] initWithStuff:stuff] animated:NO];

【问题讨论】:

  • 我不确定我是否理解正确...你为什么不在第 4 步推送另一个 GameViewController 实例
  • 而不是弹出和推送?因为我认为最好不要用大量的视图控制器弄乱堆栈。这个想法是有一个“再次播放”按钮,因此用户有可能多次按下它。
  • 我明白你在说什么......有道理。不如只在第 4 步弹出一次,然后从 GameOverViewController 返回到 GameViewController
  • 我需要一个不同的GameViewController 实例。 init 方法比较复杂,为了简洁,我省略了细节。

标签: ios objective-c cocoa-touch uiviewcontroller uinavigationcontroller


【解决方案1】:

事实证明,[self.navigationController popToRootViewControllerAnimated:NO] 行将导致 self.navigationController 为 nil,这就是为什么后续推送到 navigationController 什么都不做的原因。要解决此问题,请存储导航控制器的本地副本,并在弹出到根目录后使用该副本进行推送。这个答案的功劳来自这里:

UINavigationController popToRootViewController, and then immediately push a new view

【讨论】:

    【解决方案2】:

    mehinger的回答解决了我的问题,但是我想让它更容易使用,所以我做了以下分类。

    UINavigationController+PopAndPush.h

    @interface UINavigationController(PopAndPush)
    
    - (void)popAndPushToViewController:(UIViewController *)controller animated:(BOOL)animated;
    - (void)popAndPushToViewController:(UIViewController *)controller withCustomTransition:(CustomViewAnimationTransition)transition;
    
    @end
    

    UINavigationController+PopAndPush.m

    #import "UINavigationController+PopAndPush.h"
    
    @implementation UINavigationController(PopAndPush)
    
    - (void)popAndPushToViewController:(UIViewController *)controller animated:(BOOL)animated {
        [self popToRootViewControllerAnimated:NO];
        [self pushViewController:controller animated:animated];
    }
    
    - (void)popAndPushToViewController:(UIViewController *)controller withCustomTransition:(CustomViewAnimationTransition)transition {
        [self popToRootViewControllerAnimated:NO];
        [self pushViewController:controller withCustomTransition:transition subtype:nil];
    }
    
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      相关资源
      最近更新 更多