2013-08-19 126 views
9

我做了一个简单的测试,以更多地了解包含的视图控制器。
我其中我添加/移除使用两个按钮的视图控制器动作的视图控制器:didMoveToParentViewController被调用两次


- (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被调用两次?

谢谢!

+0

你可以记录父母吗?我怀疑在其中一个案件中没有提到你要离开前一个控制器。 –

+0

这很奇怪。也许你应该在这些方法中加入一个断点并观察堆栈跟踪。不过,我认为第二个调用是由'addSubview'和'removeFromSuperview'触发的。 – Sulthan

+0

我最近碰到同样的问题。在** removeFromSuperview **之前调用** removeFromParentViewController **似乎已经解决了我的问题。这看起来很奇怪,苹果公司的例子像你这样配置它。 https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html#//apple_ref/doc/uid/TP40007457-CH11-SW3 –

回答

7

我也有同样的问题。此外,我发现当我在viewDidLoad期间添加子视图控制器时,我只有一条消息。我通过删除对[super didMoveToParentViewController:]的呼叫来修复它。我认为这个问题与在按钮回调中添加子视图控制器有关,但我不确定为什么会导致问题。

+2

这个工程。我无法想象这是正确的解决方案,但我认为你正在从回调中添加子视图控制器。 – user

0

通过检查当前的父视图控制器,可以筛选出重复的系统调用didMoveToParentViewController。在这种情况下,我们可以使用超级呼叫。

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