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で失敗します。面白いことに、viewDidLoad内からコンテンツコントローラーを割り当てて初期化すると、すべてが機能します。別の場所から割り当てたコントローラーを渡すことができないようです。誰でも支援できますか。

4

1 に答える 1

0

actionMethod で contentController を解放しているので、init メソッドで contentController を保持する必要があります

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

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

しかし、なぜこれが必要なのですか?コントローラーはビューを制御し、他のコントローラーは制御しないことになっています。本当にそれが必要だと思うなら、おそらく UINavigationController または UITabBarController を使いたいでしょう。コントローラーなしでビューをロードすることもできます (こちらを参照)

個人的には、単純な UIViewController 内に UIViewControllers を配置することは、好ましいアプローチではないと思います。

それが役に立てば幸い

于 2010-12-11T02:30:09.587 に答える