Iphone 在解除UIViewController后向parentViewController发送消息
这对你们中的一些人来说应该很简单 我拒绝另一个Iphone 在解除UIViewController后向parentViewController发送消息,iphone,ios,objective-c,uiviewcontroller,modalviewcontroller,Iphone,Ios,Objective C,Uiviewcontroller,Modalviewcontroller,这对你们中的一些人来说应该很简单 我拒绝另一个UIViewController从自身内部以模式呈现的UIViewController。我用的是 [self dismissViewControllerAnimated:YES completion:^{ // Want to access presentingViewController here. }]; 我尝试记录self的navigationController、parentView
UIViewController
从自身内部以模式呈现的UIViewController
。我用的是
[self dismissViewControllerAnimated:YES
completion:^{
// Want to access presentingViewController here.
}];
我尝试记录self
的navigationController
、parentViewController
和presentingViewController
,但它们都返回null
苹果的医生说:
呈现视图控制器负责解除其呈现的视图控制器。如果对显示视图控制器本身调用此方法,它会自动将消息转发给显示视图控制器
根据此信息,消息将发送到
presentingViewController
。我想知道如何捕捉这条信息。是否有代表电话,或者如何查找presentedViewController是否已被解除 没有公共API可以告诉您这一点。您可以收听视图将出现:
,并通过这种方式确定显示的视图控制器正在被解除,但这很混乱。我将推荐我一直推荐的并且被认为是最佳实践的方法:永远不要将视图控制器从自身中排除。!为演示视图控制器创建代理协议,将代理设置为演示视图控制器,当需要从演示中取消演示时,调用该代理
为什么不把演示视图控制器放在一边,在解散后在块内访问它呢
__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.
}
考虑到您当前的实现,这是最不容易出错的方法。如果在调用块之前释放显示视图控制器,则不会发生错误的访问崩溃。在块中,您要捕获它以确保它不在代码的中间释放。这里我有点困惑。您有一个显示的视图控制器(称为控制器a),它由“控制器B”显示。你打电话给[自我解除视图控制器…];控制器B内的表单,对吗?但是,当完成后,您希望访问控制器B的演示视图控制器(称为控制器C),这是否正确?您能否说明为什么建议使用代理回调进行撤销?因为演示视图控制器知道如何正确撤销。例如,它可能使用了一种特殊的动画?尝试取消时,将无法再现动画。演示视图控制器具有决定如何取消的所有信息。感谢提供额外信息