2010-12-11 65 views
0

在創建應用程序中,有許多頁面與某些不同的部分大致相同。爲了處理這種情況,我創建了一個包含子視圖的容器控制器。我希望這個子視圖被另一個控制器(及其關聯的nib)的內容填充,我將根據需要根據上下文動態創建它。如何創建一個通用(容器)控制器,將接收另一個控制器作爲輸入

我有以下方法某處

- (void) someAction { 
    UIViewController* contentController = [[MyContentController alloc] init]; 
    UIViewController* containerController = [[MyContainerController alloc] initWithContentController:contentController]; 
    [navigationController pushViewController:pageController animated:YES]; 
    [contentController release]; 
    [containerController release]; 
} 

在MyContainerController.mi保留控制器屬性

- (id)initWithContentController:(UIViewController *)aContentController { 
    if ((self = [super initWithNibName:@"MyContainerController" bundle:nil])) { 
     contentController = aContentController; 
    } 
    return self; 
} 

在viewDidLoad中後,我做了以下

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [contentViewContainer addSubview:contentController.view]; 
} 

contentViewContainer是應該保存頁面特定信息的視圖。 不幸的是,這與EXC_BAD_ACCESS失敗。 有趣的是,如果我從viewDidLoad內部分配和初始化內容控制器,一切正常。看來,我不能通過我從另一個地方分配的控制器。 任何人都可以協助。

回答

0

因爲你是在actionMethod 必須保留contentController在你的init方法

- (id)initWithContentController:(UIViewController *)aContentController { 
    if ((self = [super initWithNibName:@"MyContainerController" bundle:nil])) { 

     contentController = [aContentController retain]; 
    } 
    return self; 
} 

但是,你爲什麼需要這個釋放contentController?控制器應該控制視圖,而不是其他控制器。如果你認爲你真的需要這個,那麼你可能想使用UINavigationController或UITabBarController。 您也可以加載看法,並沒有一個控制器(see here

我個人認爲,有簡單的UIViewController內UIViewControllers是不是一個最好的辦法

希望它可以幫助

+0

感謝響應。首先,你是對的,這是類似於工具欄/導航控制器。它的想法完全一樣,但它們不適合我的需求。其次,這不僅僅是將contentController作爲帶有retain的屬性的目的(這樣我就不需要自己保留它)? – nsof 2010-12-11 09:26:29

+0

如果你知道他們(UINavigationController或UITabBarController),仍然不認爲他們是你想要的,他們是好的。其次,是的就像擁有一個保留財產。如果是這樣,你需要在dealloc實現中釋放它。您也可以將其作爲分配,但您必須確保包含的控制器未被釋放,否則您的應用程序將再次崩潰(EXC_BAD_ACCESS)。在這種情況下最好保留;) – nacho4d 2010-12-11 09:59:36

相關問題