2012-07-30 80 views
1

我正在開發一個iPad應用程序,其中有一個類似於網站的導航菜單:想象一下屏幕左側的一個菜單,其中包含一系列按鈕,每次您點擊一個按鈕時會顯示一個不同的控制器。UIViewController遏制做對了嗎?

由於某些圖形限制,我不能使用os提供的任何容器控制器,所以我決定編寫自己的容器類,概念上類似於UITabBarController。我想知道如果我使用的方法是正確的,特別是addChildViewController:didMoveToParentViewController:

使用在我的容器的初始化我這樣做:

MAHomeController *home = [[MAHomeController alloc] initWithNibName:@"MAHomeController" bundle:nil]; 
[self addChildViewController:home]; 
[home didMoveToParentViewController:self]; 
homeIndex = [self.childViewControllers indexOfObject:home]; 
[home release]; 

MAConfigHomeController *config = [[MAConfigHomeController alloc] initWithNibName:@"MAConfigHomeController" bundle:nil]; 
[self addChildViewController:config]; 
[config didMoveToParentViewController:self]; 
configIndex = [self.childViewControllers indexOfObject:config]; 
[config release]; 

MAViewerHomeController *viewer = [[MAViewerHomeController alloc] initWithNibName:@"MAViewerHomeController" bundle:nil]; 
[self addChildViewController:viewer]; 
[viewer didMoveToParentViewController:self]; 
viewerIndex = [self.childViewControllers indexOfObject:viewer]; 
[viewer release]; 

正如你可以看到我添加所有內容控制器,並在添加它們後立即調用didMoveToParentViewController:。這個可以嗎?

然後處理該內容之間的導航的方法做這樣的事情:

// some stuff removed for brevity, mostly configuration stuff 
UIViewController *fromCtrl = [self.childViewControllers objectAtIndex:currentIndex]; 
UIViewController *toCtrl = [self.childViewControllers objectAtIndex:index]; 
self.currentIndex = index; 
[self transitionFromViewController:fromCtrl toViewController:toCtrl duration:0.7 options:opts animations:^(void) {} completion:^(BOOL finished) { 
     if (completion) 
      completion(); 
    }]; 

正如你可以在完成塊看,我不叫新轉換控制器上didMoveToParentViewController:,因爲它是在容器的childViewControllers之前添加。並且我也不移除舊的控制器,因爲事實上它保留在childViewCOntrollers陣列中,直到容器控制器被處理掉。

所有的事件都被正確地路由,甚至是嵌套在3個主要事件中的子控制器。此外,內存不應該成爲問題,因爲模擬內存警告顯示時,不可見控制器的視圖將被卸載並重新加載。

這個設計好嗎?

+0

它工作..? – Dustin 2012-07-30 19:11:52

+0

是的,所有的事件路由到可見的控制器和內存管理正確 – 2012-07-30 21:46:13

+0

然後我沒有看到這個問題。如果事實證明,在實踐中有一些問題,然後發佈更具體的問題。 – Dustin 2012-07-31 12:30:00

回答

1

如果您通讀了iOS開發中心的View Controller指南,那麼addChildViewController上沒有約束:didMoveToParentViewController:這會使您所做的順序不正確。

我會做的不同的唯一的事情是可能延遲這一點,以便iOS不加載筆尖,直到您真正顯示視圖。我敢打賭,如果你運行探查器,當你初始化你的父容器時,你將會加載所有的筆尖。

+1

雖然文檔似乎沒有指定,但從2012年開始,視圖控制器上的WWDC會話很明顯需要在didMoveToParentViewController之前調用addChildViewController。您還應該在中間將子視圖添加到父視圖。 – jblocksom 2012-10-05 02:02:13