Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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
Ios 无法解除ViewController?_Ios_Objective C - Fatal编程技术网

Ios 无法解除ViewController?

Ios 无法解除ViewController?,ios,objective-c,Ios,Objective C,我面临一个奇怪的问题- 我有一个导航控制器(NV),它显示根控制器(nv1)NVV1将另一个名为NVV2的视图控制器推到其上 NVV2显示一个模态控制器(MV1)MV1显示另一个模态控制器(MV2) 在MV2中的用户操作上,它通过调用self.presentingViewController dimissViewControllerAnimated来解除自身。解除后,MV2调用MV1的方法。MV1中的方法执行网络调用,现在(尝试)通过调用self.presentingViewController

我面临一个奇怪的问题-

我有一个导航控制器(
NV
),它显示根控制器(
nv1
NVV1
将另一个名为
NVV2
的视图控制器推到其上

NVV2
显示一个模态控制器(
MV1
MV1
显示另一个模态控制器(
MV2

在MV2中的用户操作上,它通过调用
self.presentingViewController dimissViewControllerAnimated
来解除自身。解除后,
MV2
调用
MV1
的方法。
MV1
中的方法执行网络调用,现在(尝试)通过调用
self.presentingViewController dismissViewControllerAnimated
来解除自身,以显示
NVV2
并调用
NVV2
的方法

我面临的问题是MV1不能被忽略。我错过什么了吗?我得到的错误是-

attempt to dismiss modal view controller whose view does not currently appear. self = <MV1: 0xaebbfc0> modalViewController = <UINavigationController: 0x1976ac10>
尝试关闭视图当前未出现的模态视图控制器。self=modalViewController=

我认为您的问题在于,您在
presentingViewController
上调用的是
dismissViewControllerAnimated
,而不是
self
。通常情况下,这很好,但如果您查看显示视图控制器,它将自动转发到它的显示视图控制器


在这种情况下,您可能发现了一个小错误,其中多个呈现视图控制器在转发消息之前没有检查它们是否也是呈现视图控制器。如果将调用更改为
self
,则可以阻止
MV1
将消息转发到
NVV2

,似乎您试图在MV2被解除之前解除MV1视图。在解除MV2之前,请尝试添加一点延迟:

[self performSelector: @selector(dismissMV1) withObject:nil afterDelay: 0.1f];
或者更好的,您可以尝试从MV2方法调用
dismissMV1
方法,在解雇完成后,使用完成块(iOS 5.0及更高版本中提供)触发
dismissMV1

[self.presentingViewController dismissViewControllerAnimated:YES completion: ^{
     [self.presentingViewController dismissMV1];
}];

我通过在
NVV2
上直接调用
dismissViewController
解决了这个问题,也就是在
MV2
中,我调用了
[self.presentingViewController.presentingViewController dismissControllerAnimated]

这解决了我在本例中的问题,因为我想直接从
MV2
移动到
NVV2
。理想情况下,我希望移动到
MV1
,执行一些网络操作,并向用户指示网络操作正在
MV1
上进行,但在我的情况下,显示在
NVV2
上也可以正常工作


然而,最初的问题仍然没有答案——如何从
MV2
移动到
MV1
,然后直接移动到
NVV2
。我认为这可能是一个小错误,因为根据文档,如果您在视图上调用
dimiscontrolleranimated
,它也会将消息发送给其父级-本质上,调用一直到
NVV2
,这是不可取的。我还没有解决这个问题的方法。

您是否正在尝试立即从MV2到MV1再到NVV2而不停顿?不是说这是不可行的…只是问一下,因为如果是这样的话,我可能知道您的代码有问题。是的。。。用户在MV2上执行操作,然后显示发生网络操作的屏幕MV1。网络操作结束后,它将移动到NVV2。是的,对于从MV2到MV1再到NVV2的任何用户操作,都不会暂停。这不起作用。我在MV1和MV2中都更改为
self
,以消除它们
MV2
确实会被解雇,但
MV1
仍然不会。错误-警告:当演示或取消正在进行时,尝试从视图控制器取消!哦,我想我一开始误读了你在你第一篇帖子中的评论…所以你是说在你解雇MV2后,MV1实际上会出现在你的屏幕上?在这种情况下,我的上述理论可能是错误的……从hukir建议的更改中收到的警告的变化来看,最好的解决方案也可能包括我们两个答案的组合。我没有将此标记为正确答案,因为它没有解决最初的问题-这只是解决了我的用例。