12

I made a simple test to learn more about contained view controller.
I have a view controller where I added/removed a view controller using two buttons' action:


- (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];
}

Class ProfileViewController extends UIViewController and override willMoveToParentViewController and didMoveToParentViewController methods


-( 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);
}

When I add view controller, I got the following logs:


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

When I remove view controller:


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

I'd like to know Why didMoveToParentViewController is invoked twice?

Thanks!

4

3 回答 3

10

I've had the same issue as well. Furthermore, I found that when I added the child view controller during viewDidLoad, I only had one message. I fixed it by removing the call to [super didMoveToParentViewController:]. I think the issue has to do with adding child view controllers while in the callback from a button, but I'm not sure why this should cause an issue.

于 2014-01-16T20:55:49.340 回答
0

didMoveToParentViewController可以通过检查当前父视图控制器来过滤掉重复的系统调用。在这种情况下,我们可以使用 super 调用。

- (void)didMoveToParentViewController:(UIViewController *)parent {
    [super didMoveToParentViewController:parent];

    if (parent == nil && self.parentViewController == nil) return;
    if (parent != nil && self.parentViewController == parent) return;

    // From here any code called once
}
于 2018-02-09T15:53:42.460 回答
-1

你必须调用'viewWillAppear'和'viewDidDisappear'的超级函数

于 2019-07-02T04:08:29.967 回答