2010-12-11 1 views
0

アプリケーションの作成中には、ほとんど同じで、いくつかの部分が異なる多くのページがあります。このような状況を処理するために、私はサブビューを含むコンテナコントローラを作成しました。私は、このサブビューが、コンテキストに基づいて必要に応じて動的に作成される別のコントローラ(およびそれに関連付けられたペン先)の内容で満たされるようにします。他のコントローラを入力として受け取る汎用(コンテナ)コントローラを作成するにはどうすればいいですか?

私はどこか

- (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で失敗します。 面白いのは、私がallocして、viewDidLoad内からコンテンツコントローラを起動するとすべてが機能するということです。それは私が別の場所から割り当てられたコントラを渡すことができないようです。 誰でも手助けできますか?

答えて

0

あなたはactionMethod でcontentControllerをリリースしているので、あなたはあなたの中にcontentControllerを保持しなければならない方法

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

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

を初期化しかし、なぜあなたはこれが必要なのですか?コントローラはビ​​ューを制御し、他のコントローラは制御しません。あなたが本当にそれを必要と思うなら、あなたはおそらくUINavigationControllerまたはUITabBarControllerを使いたいでしょう。 ます。また、(see here

コントローラなしのビューをロードすることができ、私は個人的にシンプルなのUIViewController内UIViewControllersを有する

望ましいアプローチではないと思われるが、それは応答のための

+0

感謝をお役に立てば幸いです。まず、これはツールバー/ナビコントローラに似ていることは間違いありません。まったく同じ考えですが、私のニーズにはあまり適していません。第2に、これはちょうどcontentControllerをretainを持つプロパティとして持つ目的ではありません(私はそれを自分で保持する必要はありません)。 – nsof

+0

あなたがそれら(UINavigationControllerまたはUITabBarController)を認識していて、それでもそれらがあなたが望んでいるとは思わないなら、Okです。第二に、はいは保持している財産を持つようなものです。もしそうなら、あなたはdealloc実装でそれをリリースする必要があります。あなたは割り当てられているかもしれませんが、含まれているコントローラーが解放されていないか、アプリケーションが再びクラッシュする(EXC_BAD_ACCESS)ことを確認する必要があります。この場合、保持する方が良いです;) – nacho4d

関連する問題