【问题标题】:willMoveToParentViewController and didMoveToParentViewControllerwillMoveToParentViewController 和 didMoveToParentViewController
【发布时间】:2014-03-31 20:42:26
【问题描述】:

我有两个视图控制器,它们是 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

为什么会在这里调用 willMoveToParentViewControllerdidMoveToParentViewController 方法?

此外,是否有一种用于 VCA 和 VCB 的方法,使得当 VCA 转到 VCB 时,会调用 VCA 中的一个方法。当 VCB 回到 VCA 时,VCB 中的一个方法被调用。我只是想在这些方法中做一些阅读和写作。谢谢

【问题讨论】:

  • 这两种方法并不像您认为的那样。父级不是发起推送的 viewController。父级是包含该 vc 的容器视图控制器,在您的情况下它是 navigationController。
  • 那我该怎么做才能达到我想要的效果呢?
  • 你可以使用viewWillAppear:viewDidAppear:
  • @NobodyNada 有没有一种方法可以保证在我从 VCB 回到 VCA 时被调用?
  • @NobodyNada 你能把解决方案放在下面,以便我将其标记为正确答案。

标签: ios objective-c xcode


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    这种方法比使用全局变量更独立,因此应该会产生更多可重用和可维护的代码。

    【讨论】:

      猜你喜欢
      • 2015-11-13
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      相关资源
      最近更新 更多