【问题标题】:dismissViewControllerAnimated completion block is not called不调用dismissViewControllerAnimated 完成块
【发布时间】:2013-06-26 08:35:22
【问题描述】:

我正在尝试关闭这样的视图控制器:

[composeViewController dismissViewControllerAnimated:YES completion:^{

    NSLog(@"Hello"); // Never outputted
}];

视图控制器被解除,但由于某种原因,完成块从未被调用。

我从来没有遇到过其他视图控制器不调用完成块的问题。

不过,这个视图控制器是“特殊的”,因为它是作为子视图控制器添加的(我以前在我的应用程序中没有使用过)。这是否会产生任何副作用,为什么不调用完成块?

是这样添加的:

UIViewController *rootVC = [UIApplication sharedApplication].delegate.window.rootViewController;
[rootVC addChildViewController:self];
[rootVC.view addSubview:self.view];
[self didMoveToParentViewController:rootVC];

【问题讨论】:

  • addChildViewController: 实际上将该视图控制器推送到导航堆栈上。您必须在该块触发之前将其弹出
  • 我在调用dismiss...之前尝试了[composeViewController removeFromParentViewController];(我可以看到它已从rootViewControllerchildViewControllers属性中删除),但仍然没有调用完成块。
  • 然后打开导航堆栈。
  • 你为什么不使用 -presentViewController... 来展示它?解雇方法与此方法配对。或者手动完成所有操作。当你展示一个 VC 时,容器中设置了很多属性:presentingViewController、presentedViewController 等......如果你手动进行,你将不会让它们增值
  • @Andrea 我通常使用-presentViewController...,但我使用的这个视图控制器来自外部源,所以我无法控制他们希望它如何呈现。

标签: ios objective-c cocoa-touch uiviewcontroller objective-c-blocks


【解决方案1】:

找出问题所在:我使用的第 3 方视图控制器已覆盖 - (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion 而没有实际调用 completion()

【讨论】:

    【解决方案2】:

    如果您呈现一个模态,是接收消息的视图控制器(或层次结构中的顶部,我仍然没有得到那个),它处理添加子 v.c. 的所有过程。交换视图等。看来您正在混合使用这两种技术。只用一个。
    所以使用 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion 显示它,使用dismissViewController 将其关闭,让视图控制器管理所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多