12

含まれているView Controllerについて詳しく知るために、簡単なテストを行いました。
2つのボタンのアクションを使用してView Controllerを追加/削除したView Controllerがあります。


- (IBAction)myInfoAddAction:(id)sender {
    profileViewController = [[ProfileViewController alloc] init];
    [self addChildViewController: profileViewController];
    UIView *__view = profileViewController.view;
    [self.view addSubview: __view];
    [profileViewController didMoveToParentViewController: self];
}

- (IBAction)myInfoRemoveAction:(id)sender {
    [profileViewController willMoveToParentViewController: nil];
    [profileViewController.view removeFromSuperview];
    [profileViewController removeFromParentViewController];
}

クラスのProfileViewController拡張UIViewControllerとオーバーライドwillMoveToParentViewControllerdidMoveToParentViewControllerメソッド


-( void)willMoveToParentViewController:(UIViewController *)parent
{
    [super willMoveToParentViewController: parent];
    NSLog(@"willMoveToParentViewController -> %@", self);
}

-( void) didMoveToParentViewController:(UIViewController *)parent
{
    [super didMoveToParentViewController: parent];
    NSLog(@"didMoveToParentViewController -> %@", self);
}

-( void)viewWillAppear:(BOOL)animated
{
    NSLog(@"viewWillAppear -> %@", self);
}

-( void)viewDidDisappear:(BOOL)animated
{
    NSLog(@"viewDidDisappear -> %@", self);
}

ビュー コントローラーを追加すると、次のログが表示されます。


willMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>
viewWillAppear -> <ProfileViewController: 0x8c52ea0>
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>

ビューコントローラーを削除すると:


willMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>
viewDidDisappear -> <ProfileViewController: 0x8c52ea0>
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>

知りたいのですが、なぜdidMoveToParentViewControllerが 2 回呼び出されるのですか?

ありがとう!

4

3 に答える 3

10

私も同じ問題を抱えていました。さらに、viewDidLoad 中に子ビュー コントローラーを追加すると、メッセージが 1 つしかないことがわかりました。への呼び出しを削除して修正しました[super didMoveToParentViewController:]。この問題は、ボタンからのコールバック中に子ビュー コントローラーを追加することに関係していると思いますが、これが問題を引き起こす理由がわかりません。

于 2014-01-16T20:55:49.340 に答える