【问题标题】:Loading UINavigationController from another nib automatically by UITabBarController由 UITabBarController 自动从另一个 nib 加载 UINavigationController
【发布时间】:2010-10-27 09:05:09
【问题描述】:

我想我找到了原因:IB 中的文档信息窗口有一个警告:“'Selected Navigation Controller (Second)' has nib name property set to 'SecondView.nib', but this view controller is不打算以这种方式设置其视图。”

无赖。


我在 Interface Builder 中构建了 nib,它的顶层有 UITabBarController,并在 UINavigationControllers 之间切换。

当所有内容都在一个 nib 文件中时,它工作正常,但我想为 UINavigationControllers 使用单独的 nib 文件。

从 Apple 的 TabBar 模板开始,如果我只是将 SecondView 的类更改为UINavigationController,一切都会中断:

我得到的只是:

// imgur has lost the image, sorry //

是否可以在不以编程方式设置所有内容的情况下为UINavigationController 提供单独的文件?

我希望TabBarController 处理笔尖的装卸。

【问题讨论】:

  • 嘿,这里有一些个人照片而不是截图。你能修好吗? :)

标签: iphone cocoa-touch xib


【解决方案1】:

我相信您正在寻找这样的东西。您可以将“whatever”替换为您的第二个 nib 文件的名称。

newNavController = [[UINavigationController alloc] initWithNibName:@"whatever" bundle:[NSBundle mainBundle]];

【讨论】:

  • 我想避免以编程方式加载、初始化和释放 nib。 UITabBarController 会自动执行此操作(至少对于普通的 UIViewControllers...)
【解决方案2】:

我没有尝试通过 IB 设置 UINavigationController。我有多个屏幕,每个屏幕都存储在单独的 xib 中,并且有一个扩展 UIViewController 的相应类。在 applicationDidFinishLaunching 中,我使用 xib 初始化 UIViewControllers,然后手动创建 UINavigationController,将导航控制器的视图添加到窗口并将第一个视图推送到导航控制器。

不确定这是否有帮助。

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    navigationController = [[UINavigationController alloc] init];

    FirstViewController * viewController = [[FirstViewController alloc] 
                                           initWithNibName:@"FirstView"
                                                    bundle:nil];
    [navigationController pushViewController:viewController animated:NO];
    [viewController release];
    [window addSubview:navigationController.view];
    [window makeKeyAndVisible];
}

FirstViewController 之上扩展了 UIViewController,在 IB 中创建视图,然后将文件的所有者类设置为您的类(例如此处为 FirstViewController)并将文件的所有者视图连接到 UIView 的视图。

【讨论】:

    【解决方案3】:

    首先,您的UITabBarItems 导航控制器下,而不是直接在UITabBarController 下。这可能是您的问题的一部分。

    其次,当您在 IB 中添加 UITabBarController 并单击顶层对象列表中的图标(您的第一个屏幕截图)时,属性检查器将允许您更改每个视图控制器的类型标签。使用它,您可以根据需要将它们全部更改为导航控制器。此外,由于您想从其他 nib 加载自定义视图和视图控制器,如果您查看属性检查器底部的“视图控制器”部分,您可以从项目中选择一个 nib 来加载视图。假设 nib 的“文件所有者”设置为您的 UINavigationController 子类,它应该可以正常工作。

    所有这些都不需要大量的编码工作。如果你想要我所说的内容的屏幕截图,请告诉我,以防你找不到这些面板。

    【讨论】:

    • 我不能直接在 UITabBarController 下移动 UITabBarItems - 这会在 IB 中创建新的控制器。我已经更正了 UITabViews 检查器中的控制器类型,并且在 IB 中触发了这个警告,它说它不起作用:(
    【解决方案4】:

    只需将 UINavigationController 与 FirstViewController 交换即可。

    所以层次结构应该是这样的:

    Tab bar controller
    -----Tab bar
    -----Navigation Controller
    ----------First View Controller
    ---------------Navigation Item
    ----------Tab bar item (First)
    -----Navigation Controller
    ----------Second View Controller
    ---------------Navigation Item
    ----------Tab bar item (Second)
    

    您在检查器中将 First View Controller 的 nib 设置为包含实际视图对象的 nib 文件(因为您试图将它们拆分为单独的文件,这是一件好事)。

    您有一个选项卡,该选项卡有一个导航控制器,它将 First View Controller 作为其根视图加载。

    完成。

    【讨论】:

      【解决方案5】:

      我发现了同样的警告。我将所有视图控制器保存在单独的 xib 文件中。我通过删除 .nib 名称并将其保留为空来摆脱它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        • 2015-08-18
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        相关资源
        最近更新 更多