4

對不起,漫長的故事 -如何視圖控制器「嵌入」本身在一個UINavigationController - espessially裝在容器中視圖控制器時

我有一個導航控制器層次結構的正確用法的一些問題。

UIViewController有一個屬性self.navigationController

但並不是每一個視圖控制器從導航控制器呈現 - 爲此,物業可能是零。

更是如此 -

有些視圖控制器希望能夠做到:

[self.navigationController presentViewController:nextViewController]; 

,但如果它本身不是一個導航控制器層次載,那表情就什麼也不做。

所以實習生,如果它是嵌入在導航控制器的視圖控制器可以測試:

if (self.navigationController == nil) 
{ 
    // create a UINavigationController with a root view controller - the next view controller 
    UINavigationController *nav = [UINavigationController alloc] initWithRootViewController:nextViewController]; 
    [self presentViewController:nav]; 
} 

但可能打敗目的 - 因爲如果呈現視圖控制器不是導航控制器 - 爲什麼會下一個視圖控制器必須位於導航控制器中。爲什麼當前視圖控制器不會這樣做:

[self presentViewController:nextViewController]; 

並跳過導航控制器的創建?

在這些精確的線 - 這是我現在所面臨的另一個問題 -

有些視圖控制器希望從UINavigationController提交 -

因爲他們設定導航項目 - 在所提供的工具欄項目,職稱等。導航控制器欄。

如果出於某種原因他們self.navigationController == nil - 他們怎麼能「把自己」導航控制器內,以確保它們可以訪問這些預期因素???

關於導航控制器問題容器內部視圖控制器:

如果你看看股票的iOS音樂應用程序 - 你可以看到什麼似乎是嵌入在UIViewNavigationControllerUITabBarController - 每個標籤是一個獨立的視圖控制器 - 每個人都可以「推」和「彈出」視圖控制器本身。

我需要實現類似的效果(但使用不同的佈局),所以我創建了一個容器視圖控制器,裏面有UITabBar視圖。

我然後創建的容器視圖控制器

該容器是其中每個子視圖 - 控制器的觀點是在呈現內部呈現container圖。(這些是「父視圖控制器」的'子視圖控制器的) - 這是一個繞口令,我爲此道歉。

標籤欄切換 - 父視圖控制器交換該容器中的可見視圖控制器。

現在每個視圖控制器是非常通用的 - 他們沒有自己的遏制的想法,但希望以設置標題,以具有設定一個UINavigationController可變(非空) - 按鈕 - 導航項目等

通用黑盒視圖控制器如何在導航控制器中「呈現」自身(嵌入其自身)

容器視圖控制器如何設置子視圖控制器的navigationController屬性?

回答

0

我有一個應用程序有一個placeholder(self.mainView)viewControllers根據選項卡選擇放置。其中一些需要一個NavigationController,而另一些則不需要。如果self.navigationController == nil,你可以隨時做一個測試並相應地工作。

這裏是一些示例代碼,我用它來顯示viewController到那個可以幫助你的佔位符。

if (self.currentController) { 
    [self.currentController willMoveToParentViewController:nil]; 
    [[self.currentController view] removeFromSuperview]; 
    [self.currentController removeFromParentViewController]; 
    self.currentController = nil; 
} 


switch (tag) { 
    case 0: 
     self.currentController = [self.storyboard instantiateViewControllerWithIdentifier:@"AboutViewController"]; 
     break; 

    case 1: { 
     UINavigationController *controller = [[UINavigationController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"EventsViewController"]]; 
     self.currentController = controller; 
    } 
     break; 
} 


if (self.currentController) { 
    [self addChildViewController:self.currentController]; 
    [self.mainView addSubview:self.currentController.view]; 
    [self.currentController didMoveToParentViewController:self]; 
    [self adjustMainView]; 
    [self.view layoutIfNeeded]; 
} 
相關問題