繁体   English   中英

如何使用Interface Builder添加导航控制器?

[英]How to add a Navigation Controller with Interface Builder?

1.步骤:创建一个新的UIViewController:
-Xcode->新文件...->可可触摸类-> UIViewController
-名称:MyViewController

2.步骤:将“导航控制器”(UINavigationController)从库拖放到MyViewController.xib

替代文字

第3步:我确定,我必须做一些事情才能正确连接导航控制器,不是吗?

第4步:尝试将新的View Controller作为模式对话框启动:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
NSLog(@"navContr: %@", myViewController.navigationController);
[self.navigationController presentModalViewController: myViewController animated:YES]; 

结果:“ navContr:nil”

第5步:您可以看到新的模式视图(MyViewController),但是没有NavigationController和UINavigationBar。

非常感谢您的帮助!


更新1:

6.Step:我将一个新的UIViewController(ViewNavi2)设置为“ Root View Controller”:
替代文字

第7步:在类MyViewController中定义一个IBOutlet UINavigationController *navigationController并配置xib:Navigation Controller-> Connections-> Referenceing Outlets

但是我的导航控制器仍然是nil :-(

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
NSLog(@"navContr: %@", myViewController.navigationController);
// -> "navContr: nil"

我还想将导航控制器包含在NIB文件中,但是Apple文档所说的只是在没有实际说明的情况下“不是最佳”。 我希望主选项卡式窗口调出包含典型导航控件的模式窗口,而无需以编程方式定义导航控制器。 我将分享我的做法。

您的代码与我的代码非常相似,因为我还在MyViewController中定义了IBOutlet UINavigationController *navigationController 在Interface Builder中,我只需在根视图控制器中定义我的视图,然后将File's Owner-> view设置为该视图定义。

与您的代码类似,我在父窗口中执行了以下操作:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[self presentModalViewController:myViewController animated:YES];

(我在self上调用presentModelViewController,我不知道为什么要使用self.navigationController 。)测试时,结果是从NIB文件中加载了我的视图,但是导航栏丢失了。 MyViewController中的另一行代码修复了此问题:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setView:myNavigationController.view];

}

我在这里所做的只是将MyViewController的视图设置为指向myNavigationController.view,该视图包含NIB文件中定义的所有内容,包括导航控制器。

在XCode中查看“基于导航的应用程序”的模板。 (新项目->基于导航的应用程序)然后在Interface Builder中打开MainWindow.xib。 尽管它不是视图,但可以将其视为在步骤1中创建的视图控制器。然后查看检查器中引用的“ Root View Controller”,并查看如何将其连接到“ Root View Controller”笔尖。属性检查器和身份检查器中的“ RootViewController”类。

您将需要在“ RootViewController”版本中将要显示的内容放在导航的根目录中。 通常,接下来显示的控制器是“ DetailViewController”。 再次,通读模板提供的示例代码,您将看到如何开始。 在RootViewController.m的示例模板中的didSelectRowAtIndexPath中查看注释的代码。 您将需要创建自己的视图控制器以用作DetailViewController。

希望这会为您清除一切。

//根据您的评论编辑//
苹果文档说,如果您想使用IB来制作导航控制器,则应将它们真正放入MainWindow.xib中。 我正在修改一个事实,即您不能将NavigationController作为UIView对象的子视图。 从头开始,您可以做的就是使用IB将导航栏对象添加到视图控制器,然后从那里控制内容。

从Apple文档“尽管您也可以从主nib文件(或任何其他nib文件)中加载独立的或以模态显示的导航控制器,但这并不是最佳选择。在这些情况下,通常更容易以编程方式在以下位置创建导航控制器使用点。”

//更多编辑///在XCode4中,项目模板现在称为“ Master Detail”项目。 这是因为它将在iPad中设置为拆分视图控制器,但在iPhone中仍是常规导航项目。 在答案中我引用“ RootViewController”的地方,您现在将找到一个名为“ MasterViewController”的东西。

下一个代码将不会给您任何有效的对象。

NSLog(@"navContr: %@", myViewController.navigationController);

原因是因为UIViewController的navigationController属性仅在视图控制器位于其堆栈中时才返回导航控制器。 如果找不到导航控制器,则此属性为nil。 您的视图控制器不在导航控制器的堆栈中。 无论如何,我什至不确定您是否正确初始化了我们的导航控制器。 阅读一些文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM