dismissViewControllerAnimated完成块未被调用

10

我试图像这样解除一个视图控制器:

[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: 实际上将该视图控制器推入导航堆栈。在该块可以触发之前,您必须将其弹出。 - CodaFi
我尝试在调用dismiss...之前执行[composeViewController removeFromParentViewController];,我可以看到它已从rootViewControllerchildViewControllers属性中移除,但是完成块仍然未被调用。 - Peter Warbo
将导航堆栈弹出。 - CodaFi
1
为什么不使用-presentViewController...来呈现它?dismiss方法与此方法配对使用。或者手动完成所有操作。当您呈现VC时,容器中设置了许多属性:presentingViewController、presentedViewController等等...如果您手动执行,则不会将它们赋值。 - Andrea
@Andrea 我通常使用 -presentViewController... 但是我正在使用的这个视图控制器来自外部源,所以我无法控制他们想要如何呈现它。 - Peter Warbo
@CodaFi 你有什么建议?输出所有视图控制器吗? - Peter Warbo
2个回答

1
发现问题所在:我使用的第三方视图控制器重写了- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion,但实际上没有调用completion()

0
如果你展示一个模态视图,接收消息的视图控制器(或者是在层级中的顶部,我还没搞清楚)会处理添加子视图控制器、交换视图等所有过程。看起来你在使用两种技术的混合。只使用一种就好。所以使用- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion来展示它,使用dismissViewController来关闭它,让视图控制器管理一切。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接