Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在解除UIViewController后向parentViewController发送消息_Iphone_Ios_Objective C_Uiviewcontroller_Modalviewcontroller - Fatal编程技术网

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),这是否正确?您能否说明为什么建议使用代理回调进行撤销?因为演示视图控制器知道如何正确撤销。例如,它可能使用了一种特殊的动画?尝试取消时,将无法再现动画。演示视图控制器具有决定如何取消的所有信息。感谢提供额外信息