对于你们中的一些人来说这应该很简单。
我正在驳回UIViewController
内部另一个UIViewController
以模态方式呈现的[self dismissViewControllerAnimated:YES
completion:^{
// Want to access presentingViewController here.
}];
。我正在使用
self
我尝试记录navigationController
的{{1}},parentViewController
和presentingViewController
,但他们都返回null
。
Apple的医生说:
呈现视图控制器负责解除它所呈现的视图控制器。如果在呈现的视图控制器本身上调用此方法,它会自动将消息转发给呈现视图控制器。
根据此,消息将发送到presentingViewController
。我想知道如何捕捉这条消息。是否有委托电话或如何查找presentViewController是否被解雇。
答案 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.
}
考虑到您当前的实施,这是最不容易出错的方法。如果在调用块之前释放呈现视图控制器,则不会发生错误的访问崩溃。在块中,您可以强烈捕获它以确保它不会在代码中间释放。