【问题标题】:How to replace RootViewController in "Navigation-based application"如何在“基于导航的应用程序”中替换 RootViewController
【发布时间】:2011-08-15 05:13:54
【问题描述】:

我有一个在 XCode 中使用“基于导航的应用程序”模板的应用程序。

现在我想更改它,以便加载的第一个视图是常规(自定义)UIView,如果用户单击特定按钮,我会将原始 RootViewController 推到 NavigationController 上。

我知道某处有人用我的 RootViewController 调用它:

- (id)initWithRootViewController:(UIViewController *)rootViewController

我想知道如何用我的新类替换参数。

【问题讨论】:

    标签: objective-c xcode interface-builder xib nib


    【解决方案1】:

    ^ 这些都是以编程方式完成的所有方法。这很酷。但我在 Xcode 中使用界面构建器和故事板,所以这是添加新视图控制器的简单快捷方式:

    • 打开有问题的情节提要
    • 将新的视图控制器从对象列表(右侧工具栏底部)拖动到情节提要中
    • 在按住 CONTROL 键的同时,单击并从导航控制器的中间(应该是空白和灰色)拖动到新的白色视图。
    • 在弹出窗口中,选择 Relation Segue: Root View Controller(应该低于您之前可能见过的普通推送/模态/自定义选项)

    多田!享受您的新根视图控制器,无需因程序化创建而耽误您的一天。

    【讨论】:

    • 仅仅因为您更喜欢程序化创建,并不意味着您应该否决这个答案。这工作得很好。
    • 但是 OP 在单击按钮后询问“替换” RootViewController,所以这不是问题的答案。
    • @woody121 这个 stackoverflow 页面是用于更改根视图控制器的 xcode / interface builder 方法的顶级谷歌搜索结果。你的回答很完美,谢谢!
    【解决方案2】:

    如果要替换导航堆栈的根视图控制器,可以将其视图控制器数组的第一个对象替换为 -

    NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
    
    NewViewController *nvc = [[NewViewController alloc] init];
    [viewControllers replaceObjectAtIndex:0 withObject:nvc];
    [self.navigationController setViewControllers:viewControllers];
    

    【讨论】:

    • 这是一个有趣的想法。我比现在做的更喜欢它,但请参阅我在 ljkyser 的回答中对魔法的评论。
    • 你试过这个吗?你不能用 NSMutableArray 强制转换 NSArray!您必须使用 [self.navigationController.viewControllers mutableCopy] 创建一个 NSMutableArray。
    【解决方案3】:

    查看主应用程序委托 .m 文件并找到方法

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    里面会有这样的一行

    self.window.rootViewController = self.navigationController;

    您可以在那里实例化一个不同的视图控制器并将其分配给 rootViewController

    【讨论】:

    • 这就是我正在做的。我注意到股票didFinishLaunching 没有实例化navigationController。我很好奇谁在哪里,在哪里,以及我如何插话。名义上,我试图避免做两次工作(即实例化并立即丢弃导航控制器)。真的,我想了解 XIB 的幕后魔力。
    • 它实际上存储在 MainWindow.xib 文件中,我相信它是从那里延迟加载的。我认为您可以通过界面生成器更改它使用的默认值,但我以前没有这样做过。我们几乎总是在没有界面构建器的情况下从代码中完成所有事情,因此我们完全避免了这种情况。
    • 是的,我几乎总是从代码中做所有事情。这是一个较旧的项目——学习曲线的遗产。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多