0

这对你们中的一些人来说应该很简单。

我正在消除一个UIViewController由另一个UIViewController从自身内部以模态方式呈现的东西。我正在使用

[self dismissViewControllerAnimated:YES
                         completion:^{
    // Want to access presentingViewController here.
}];

我尝试了记录self的和navigationController,但它们都返回。parentViewControllerpresentingViewControllernull

苹果的文档说:

呈现视图控制器负责关闭它呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,它会自动将消息转发到呈现的视图控制器。

据此,消息被发送到presentingViewController. 我想知道如何捕捉这个消息。是否有委托调用,或者我该如何查找presentedViewController 是否被解雇。

4

1 回答 1

1

没有公共 API 可以告诉您这一点。您可以通过这种方式聆听viewWillAppear:并弄清楚呈现的视图控制器正在被解除,但这很混乱。我会推荐我一直推荐并被认为是最佳实践的方法:永远不要关闭视图控制器!为您的呈现视图控制器创建一个委托协议,将委托设置为呈现视图控制器,当需要从呈现中解除呈现时,调用委托。


为什么不将呈现视图控制器放在一边,并在关闭后在块内访问它?

__weak id weakPresentingViewController = self.presentingViewController;

[self dismissViewControllerAnimated:YES completion: ^
{
    id strongPresentingViewController = weakPresentingViewController;

    if(strongPresentingViewController == nil) return;

    //Do what you will with the presenting view controller.
}

考虑到您当前的实现,这是最不容易出错的方法。如果呈现视图控制器在您的块被调用之前被释放,您将不会遇到错误的访问崩溃。在块内部,您强烈地捕获它以确保它不会在您的代码中间释放。

于 2013-09-07T06:17:16.157 回答