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建议的更改中收到的警告的变化来看,最好的解决方案也可能包括我们两个答案的组合。我没有将此标记为正确答案,因为它没有解决最初的问题-这只是解决了我的用例。