我有两个视图控制器,它们是VCA和VCB。我还有一个导航控制器,从VCA推送到VCB。在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
为什么在这里调用willMoveToParentViewController
和didMoveToParentViewController
方法?
此外,是否存在VCA和VCB的方法,使得当VCA进入VCB时,调用VCA中的方法。当VCB返回VCA时,VCB中的方法被调用。我只是想用这些方法做一些阅读和写作。感谢
答案 0 :(得分:2)
您可以将VCB的BOOL
中的全局viewWillDisappear:
变量设置为YES
,然后设置为VCA的viewWillAppear:
,如果变量为YES
,那么您就去了从VCB到VCA。请务必在VCA的NO
中将变量设置回viewDidAppear:
。
答案 1 :(得分:1)
您可以通过查询[self isMovingToParentViewController]
或viewWillAppear:
中的viewDidAppear:
来实现此目的。如果返回YES
,则视图控制器正在显示,因为它已被推送。如果返回NO
,则视图控制器出现,因为它上方的视图控制器从导航堆栈中弹出(返回)。
The documentation令人困惑。虽然从isMovingToParentViewController
或YES
内部调用时viewWillAppear:
仅返回viewDidAppear:
,但它也可能会从这些方法中返回NO
。
当视图消失时,您可以查询[self isMovingFromParentViewController]
以获取类似信息。
这种方法比使用全局变量更自包含,因此应该导致更多可重用和可维护的代码。