willMoveToParentViewController和didMoveToParentViewController

时间:2014-03-31 20:42:26

标签: ios objective-c xcode

我有两个视图控制器,它们是VCA和VCB。我还有一个导航控制器,从VCA推送到VC​​B。在VCA的prepareForSegue方法中,我有以下代码行:

- (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中的方法被调用。我只是想用这些方法做一些阅读和写作。感谢

2 个答案:

答案 0 :(得分:2)

您可以将VCB的BOOL中的全局viewWillDisappear:变量设置为YES,然后设置为VCA的viewWillAppear:,如果变量为YES,那么您就去了从VCB到VCA。请务必在VCA的NO中将变量设置回viewDidAppear:

答案 1 :(得分:1)

您可以通过查询[self isMovingToParentViewController]viewWillAppear:中的viewDidAppear:来实现此目的。如果返回YES,则视图控制器正在显示,因为它已被推送。如果返回NO,则视图控制器出现,因为它上方的视图控制器从导航堆栈中弹出(返回)。

The documentation令人困惑。虽然从isMovingToParentViewControllerYES内部调用时viewWillAppear:仅返回viewDidAppear: ,但它也可能会从这些方法中返回NO

当视图消失时,您可以查询[self isMovingFromParentViewController]以获取类似信息。

这种方法比使用全局变量更自包含,因此应该导致更多可重用和可维护的代码。