我只是第一次進入iOS開發,我不得不做的第一件事就是實現一個custom container view controller - 我們稱之爲SideBarViewController
- 它將幾個可能的子視圖控制器中的哪一個顯示,幾乎完全像標準標籤欄控制器。 (這是一個很值得標籤欄控制器但有可隱藏側邊菜單,而不是一個標籤欄。)addChildViewController實際上做了什麼?
按照蘋果的文檔中的說明,我所說的addChildViewController
每當我添加一個子視圖控制器到我的容器。我換出當前子視圖控制器由SideBarViewController
正在顯示的代碼如下所示:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
然後,我開始試圖找出正是addChildViewController
在這裏所做的,我意識到,我不知道。除了在.childViewControllers
陣列中粘貼新的ViewController
之外,它似乎對任何內容都沒有影響。從子控制器的視圖到我在故事板上設置的子控制器的操作和插座仍然可以正常工作,即使我從未撥打過addChildViewController
,我也無法想象會有什麼影響。
事實上,如果我重寫我的代碼不調用addChildViewController
,而是這個樣子......
- (void)showViewController:(UIViewController *)newViewController {
// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
...然後我的應用程序仍然運轉完好,只要我可以告訴!
蘋果的文檔並沒有說明什麼addChildViewController
做什麼,或爲什麼我們應該叫它。
將給定視圖控制器作爲子:什麼樣的方法執行或爲什麼它應在其部分被用於在
UIViewController
Class Reference的是,目前的相關描述的整個範圍。 ... 此方法僅用於通過自定義容器視圖控制器的實現進行調用。如果您重寫此方法,則必須在實現中調用super。
還有早些時候在同一頁面上這一段:
你的容器視圖控制器必須將孩子的根視圖到視圖層次結構前一個子視圖控制器與自身關聯。這允許iOS將事件正確地路由到子視圖控制器以及這些控制器管理的視圖。同樣,在從其視圖層次結構中刪除子視圖的根視圖之後,它應該將該子視圖控制器與其自身斷開連接。爲了建立或者中斷這些關聯,你的容器調用由基類定義的特定方法。這些方法不打算由您的容器類的客戶端調用;它們只能在您的容器的實施中使用,以提供預期的遏制行爲。
以下是你可能需要調用的基本方法:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
,但它不提供任何線索,以什麼它所談論的'事件'或'預期的遏制行爲'是,或者爲什麼(甚至是何時)調用這些方法是'必不可少的'。
Apple文檔的「自定義容器視圖控制器」部分中的自定義容器視圖控制器的示例都調用此方法,所以我認爲它除了將子ViewController彈出到數組之外還有一些重要用途,但我無法弄清楚這是什麼目的。這種方法做什麼,爲什麼我應該叫它?
蘋果[** 2011 ** WWDC(https://developer.apple.com/videos/wwdc/2011/)視頻頁面有關於此主題的_great_會話(「實現UIViewController遏制」)。 – Alladinian