13

1步:创建一个新的UIViewController:
- Xcode的 - >新建文件 - >可可触摸类 - >的UIViewController
- 名称:MyViewController如何使用Interface Builder添加导航控制器?

第2步:拖放从库拖放一个 “导航器”(UINavigationController的),以MyViewController.xib

alt text

3.Step:我敢肯定,我必须做些事情才能正确连接导航控制器,不是吗?

4.Step:尝试启动新的视图控制器作为一个模态对话框:

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

结果: “navContr:无”

5.Step:你可以看到新的模式视图(MyViewController),但没有NavigationController,也没有UINavigationBar。

非常感谢您的帮助!


更新1:

6.Step:我设置新的UIViewController(ViewNavi2)为 “根视图控制器”:
alt text

7.Step:我在类MyViewController中定义了一个IBOutlet UINavigationController *navigationController并配置了xib:导航控制器 - >连接 - >引用插座

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

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

[here](http://rdcworld-iphone.blogspot.in/2013/03/how-to-add-navigation-controller-in.html)是添加导航控制器的简单教程 – swiftBoy 2013-03-25 05:14:13

回答

15

我也想将导航控制器包含在NIB文件中,但Apple文档所说的所有内容都是“不是最优的“没有真正解释如何去做。我希望我的主要选项卡式窗口调用包含典型导航控件的模式窗口,而无需通过编程方式定义导航控制器。我会分享我是如何做到的。

您的代码与我的代码非常相似,因为我还在MyViewController中定义了一个IBOutlet UINavigationController *navigationController。在Interface Builder中,我只是在根视图控制器中定义了我的视图,并将文件的所有者 - >视图设置为该视图定义。

而且你的代码一样,我做我的父窗口如下:

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

(我打电话presentModelViewController自我,我不知道为什么你有self.navigationController)当我测试这一点,结果是我的视图是从NIB文件加载的,但导航栏丢失了。在MyViewController一行代码解决了这个问题:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self setView:myNavigationController.view]; 

} 

所有我在这里做,是设置MyViewController的观点指向myNavigationController.view,其中包含在NIB文件中定义的,包括导航控制器的一切。

0

下面的代码是不会给你带来任何有效的对象。

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

的原因是因为UIViewController的only returns a navigation controller if the view controller is in its stack. This property is nil if a navigation controller cannot be found.您的视图控制器的navigationController属性在导航控制器的堆栈没有。无论如何,我甚至不确定你是否正确初始化我们的导航控制器。阅读一些文档。

+0

谢谢你的帮助也帮助!它接缝,“视图控制器不在其堆栈中”。是的,我认为我没有正确初始化我的导航控制器。但是我怎么能在Interface Builder中做到这一点?我更新我的问题,请查看“更新1”。 – Manni 2011-01-13 13:26:40

+0

另外,如果你的视图是在导航控制器堆栈中,但你(自动)释放它在你不应该有的地方,self.navigationController可能是零。卫生署! – AndrewS 2011-07-25 05:14:48

2

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

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

希望这会为你解决问题。

// EDITS基于你的评论//
苹果文档说如果你想用IB来制作你的导航控制器,你应该把它们放在你的MainWindow.xib中。我正在修补你不能将NavigationController作为你的UIView对象的子视图。从你开始的地方你可以做的是使用IB向你的视图控制器添加一个导航栏对象,然后从那里控制事物。

从Apple文档“尽管您也可以从主要的nib文件(或任何其他nib文件)加载独立或模态呈现的导航控制器,但这样做并不是最佳的。在这些情况下,创建导航控制器在编程上处于使用状态。“

// MORE EDITS // 在XCode4中,项目模板现在称为“主细节”项目。这是因为它将在iPad中设置为分屏视图控制器,但仍然是iPhone中的常规导航项目。我在哪里可以找到答案中的“RootViewController”,你现在会发现一些名为“MasterViewController”的东西

+0

非常感谢您的帮助!我仔细分析基于导航的应用程序。是的,有一个带有工作导航控制器的MainWindow.xib。它与AppDelegate连接,这是我的MyViewController的唯一区别。在模板项目中,你看不到MainWindow。xib被初始化,也许我的代码“MyViewController * myViewController = [[MyViewController alloc] initWithNibName:@”MyViewController“bundle:nil];”是错的。请在我的问题中查看“更新1”。 – Manni 2011-01-13 13:21:01

相关问题