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

相關問題