在解除UIViewController后发送消息给parentViewController

时间:2013-09-06 22:32:49

标签: iphone ios objective-c uiviewcontroller modalviewcontroller

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

我正在驳回UIViewController内部另一个UIViewController以模态方式呈现的[self dismissViewControllerAnimated:YES completion:^{ // Want to access presentingViewController here. }]; 。我正在使用

这样做
self

我尝试记录navigationController的{​​{1}},parentViewControllerpresentingViewController,但他们都返回null

Apple的医生说:

  

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

根据此,消息将发送到presentingViewController。我想知道如何捕捉这条消息。是否有委托电话或如何查找presentViewController是否被解雇。

1 个答案:

答案 0 :(得分: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.
}

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