2014-03-31 34 views
-1

我有兩個視圖控制器,它們是VCA和VCB。我也有一個導航控制器,並從VCA推送到VC​​B。在VCA的prepareForSegue方法,我有下面的代碼行:willMoveToParentViewController和didMoveToParentViewController

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"placePiece"]) { 
     NSLog(@"go to screen two"); 
    } 
} 

,並在我的VCB,我有以下兩種方法:

- (void) willMoveToParentViewController:(UIViewController *)parent { 
    NSLog(@"will move back to screen one"); 
} 

- (void) didMoveToParentViewController:(UIViewController *)parent { 
    NSLog(@"did move back to screen one"); 
} 

我不明白的是,當我從VCA去VCB,我得到了在控制檯下面的消息:

2014-03-31 15:38:05.317 Li-Lab5[18865:60b] go to screen two 
2014-03-31 15:38:05.318 Li-Lab5[18865:60b] will move back to screen one 
2014-03-31 15:38:05.848 Li-Lab5[18865:60b] did move back to screen one 

爲什麼willMoveToParentViewControllerdidMoveToParentViewController方法來到這裏叫什麼?

此外,是否有一種VCA和VCB的方法,以便當VCA進入VCB時,VCA中的方法被調用。當VCB回到VCA時,VCB中的一個方法被調用。我只是想用這些方法做一些閱讀和寫作。由於

+4

這兩種方法不會做你認爲他們做的事。父母不是啓動推送的viewController。父母是容納該vc的容器視圖控制器,在你的情況下它是navigationController。 –

+0

那麼我能做些什麼來達到我想要的效果? – photosynthesis

+0

您可以使用'viewWillAppear:'和'viewDidAppear:'。 – NobodyNada

回答

2

您可以在VCB的viewWillDisappear:YES全球BOOL變量,然後在VCA的viewWillAppear:,如果變量是YES那麼你從VCB去VCA。只要確保在VCA的viewDidAppear:中將變量設置回NO即可。

1

您可以通過查詢[self isMovingToParentViewController],viewWillAppear:viewDidAppear:來實現此目的。如果這返回YES,視圖控制器出現,因爲它被推。如果這返回NO,則視圖控制器正在出現,因爲其上方的視圖控制器已從導航堆棧彈出(返回)。

The documentation令人困惑。 isMovingToParentViewController返回YES只有當從viewWillAppear:viewDidAppear:中調用時,它也可能會從這些方法的內部返回NO

當視圖正在消失時,您可以查詢[self isMovingFromParentViewController]以獲取類似信息。

這種方法比使用全局變量更自包含,所以應該導致更多的可重用和可維護的代碼。

相關問題