2013-08-19 4 views
9

私は、含まれているビューコントローラの詳細については、簡単なテストを行いました。
は私が追加/アクション2つのボタンを使用してビュー・コントローラを除去ビューコントローラ有する:didMoveToParentViewControllerが2回呼び出されました


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

Iビュー・コントローラを追加私は次のログを取得しました:


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

親もログに記録できますか?私は、あなたが以前のコントローラを離れることを示すために、それらのケースの1つでは、「無」と考えています。 –

+0

それはかなり変です。たぶん、メソッドにブレークポイントを置き、スタックトレースを監視する必要があります。しかし、私は2番目の呼び出しが 'addSubview'と' removeFromSuperview'によって引き起こされると思います。 – Sulthan

+0

最近同じ問題が発生しました。 ** removeFromParentViewController **を呼び出す前** ** removeFromSuperview **は私の問題を修正したようです。これはAppleの例があなたのようにそれを設定しているのを見ると奇妙なことです。 https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html#//apple_ref/doc/uid/TP40007457-CH11-SW3 –

答えて

7

私も同じ問題がありました。さらに、viewDidLoadの間に子ビューコントローラを追加したときには、メッセージが1つしかないことがわかりました。私は[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 
} 
関連する問題