调用了 dismissViewControllerAnimated 但是 ViewController 没有被解除显示

44

我在dismissViewControllerAnimated方法上遇到了问题,它不能关闭视图。

应用程序中的情况如下:

  • 选择了ItemViewController中的单元格。
  • 将视图ItemDetailViewController并通过代理发送详细信息
  • 用户选择“完成”,事件通过代理发送以在ItemViewController中关闭

所有这些都有效,除了视图没有被关闭,也没有出现错误。有人能看出问题在哪里吗?

- (void)itemDetailViewControllerDidFinish:(ItemDetailViewController *)controller
{
    NSLog(@"Controller: %@", controller);
    // Returns - Controller: <ItemDetailViewController: 0x6b68b60>

    [self dismissViewControllerAnimated:YES completion:nil];
}

如果您发送 dismissModalViewControllerAnimated: 会怎样呢? - user971401
self 如何被推送到屏幕上? - Nekto
@Vince:我尝试过了,但如果segue是“push”的话似乎不起作用。 - Ad Taylor
Nekto:如果我理解正确,self === controller。 - Ad Taylor
@AdTaylor - self 不能被推送为VC。难道不是VC向用户呈现第二个VC吗? - user971401
5个回答

66

如果你调用[controller.navigationController popViewControllerAnimated:YES]会发生什么呢?

同样地,如果你将[controller dismissViewControllerAnimated:YES completion:nil]调用到self上,会发生什么呢?


10
适用于我的确切语法:[self.navigationController popViewControllerAnimated:YES]; - Dan
2
推出使用弹出,呈现使用解除。 - sam_smith
3
如果你的页面嵌入到导航控制器中,似乎self:dismissviewcontroller无法正常工作。 - Peter Webb
popViewController 像魔法一样顺利运行。 - Abdul Waheed

10
答案在这个页面里:dismissviewcontrolleranimated-vs-popviewcontrolleranimated

当你没有导航控制器时,使用dismissViewController。但很可能你正在使用导航控制器,那么请使用self.navigationController popViewController。

还要注意lemax的评论:使用NULL而不是nill作为completionhandler。


5
对于非对象指针,请使用 NULL。因此,你在这里不应该使用 NULL。 - Daniel Sanchez

5

我在iOS5中遇到了一个问题,标准的完成回调不允许视图完全关闭(仅限于模态对话框中当前推送的视图)。

[controller dismissViewControllerAnimated:YES completion:^ {     // }];

iOS5的解决方案是不使用回调函数:

[controller dismissViewControllerAnimated:YES completion:nil];

4

我曾经遇到一个问题,在UIViewController中调用dismissViewControllerAnimated时,虽然键盘消失了,但是视图本身并没有被关闭。

通过使用两个调用来解决这个问题:

[self dismissViewControllerAnimated:NO completion:nil];
[self dismissViewControllerAnimated:YES completion:nil];

先为键盘创建一个即时的动画效果,然后再为控制器创建一个动态的动画效果。


0
你的情况是 - ItemViewController -> ItemDetailViewController (在navigationController上推出) self.dismissViewController(...)解除一个在self上呈现的视图控制器(在你的情况下是ItemViewController)。在这里,你没有在self上呈现任何VC,而是将一个新的VC推到了导航堆栈上。因此,正确的方法是解除ItemDetailViewController: self.navigationController.popViewController(true)。请阅读dismissViewController(...)的描述以获得更多的清晰度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接