1

次のコードを使用して、子ViewControllerをプライマリViewControllerに追加しています。

HPSPhotoLibraryOverlayController* controller = [[HPSPhotoLibraryOverlayController alloc] init];

[self.view addSubview:controller.view];

[self addChildViewController:controller];
[controller didMoveToParentViewController:self]; 

子ビューコントローラーが制御しているビューには、タップすると子ビューと子ビューコントローラーをプライマリビューコントローラーから削除するボタンが含まれています。

ボタンが押されたときに実行される子ViewControllerのメソッドは、次のようになります。

-(void)photoLibraryCloseButtonTapped:(id)sender
{
   [self.view removeFromSuperview];

   [(HPSFormController*)_parentController photoLibraryRequestingClose];
}

そして、子ViewControllerを閉じるプライマリViewControllerのメソッドは次のようになります。

-(void)photoLibraryRequestingClose
{
    UIViewController* controllerToRemove;
    for (UIViewController* controller in self.childViewControllers) {
        if ([controller isKindOfClass:[HPSPhotoLibraryOverlayController class]])
        {
            [controller removeFromParentViewController];
            controllerToRemove = controller;
        }

    }

    if (controllerToRemove)
    {
        controllerToRemove = nil;
    }

}

このコードはすべて機能します。ただし、子ビューコントローラの-(void)photoLibraryCloseButtonTapped:(id)senderメソッドがまだ実行されている間(つまり、-(void)photoLibraryRequestingCloseメソッドはまだ返されていませんが、子ビューコントローラはnilに設定されているようですが、 photoLibraryRequestingCloseを呼び出した子ビューコントローラーを無効にします。

ARCを使用しています。

これが機能する理由と、子コントローラーの削除をトリガーするボタンが子ビューコントローラーによって管理されていることを念頭に置いて、子ビューコントローラーの削除を別の方法で管理する必要があります。

どうもありがとう。

4

1 に答える 1

1

特にリスト14-2で、カスタムコンテナビューコントローラの実装に関するApplesViewコントローラプログラミングガイドをご覧ください。

- (void) hideContentController: (UIViewController*) content
{
   [content willMoveToParentViewController:nil];
   [content.view removeFromSuperview];
   [content removeFromParentViewController];
}

質問に答えるには、次のようにコードを変更する必要があります。

- (void)photoLibraryCloseButtonTapped:(id)sender
{
   [(HPSFormController*)_parentController photoLibraryControllerRequestingClose:self];
}

- (void)photoLibraryControllerRequestingClose:(UIViewController *)childController
{
   [childController willMoveToParentViewController:nil];
   [childController.view removeFromSuperview];
   [childController removeFromParentViewController];
}
于 2013-02-21T13:53:53.137 に答える