取消模态视图&应用程序崩溃

时间:2011-01-31 06:44:56

标签: iphone cocoa ios modalviewcontroller presentmodalviewcontroller

我对取消模态视图感到困惑:

案例1:我有一个导航视图控制器,我从这个导航视图控制器呈现一个模态视图控制器。现在,当我要从哪里取消这个模态视图时,我应该调用dismissModalView方法 - 导航视图控制器还是模态视图控制器?

案例2:我有一个模态视图控制器,我从第一个模态视图控制器呈现另一个模态视图控制器。现在,当我要从哪里取消第二个模态视图时,我应该调用dismissModalView方法 - frist模态视图控制器还是第二个模态视图控制器?

从错误的地方取消会导致应用程序崩溃吗?

3 个答案:

答案 0 :(得分:1)

  1. 你应该忽略模态视图 控制器。
  2. 你应该把它从 第二模态视图控制器。
  3. 应用程序崩溃是因为当您尝试关闭模态视图控制器时,相应视图控制器的范围丢失,可能是您在解除之前释放了视图控制器

答案 1 :(得分:1)

处理模态视图控制器的一种可取方法是向我们发送通知,通知提供它的类以释放它。通常,您使用与此类似的代码来显示模态视图。

SomeClass *yourViewController = [[SomeClass alloc] initWithNibName:@"SomeClass" bundle:nil];
[self presentModalViewController: yourViewController animated: YES];
[yourViewController release];

使用上面的代码,您的模态视图最终应该保留计数为1.当您关闭它时,父视图将释放它,它将从内存中清除。模态视图中的“关闭”按钮应该执行如下所示的代码:

- (void)dismissSelf{
  [[NSNotificationCenter defaultCenter] postNotifivationName:@"I'm done" object:self];
}

回到父视图控制器中,你应该监听这个通知,然后在发布通知时关闭模态视图。

那就是说,回答你的问题:

  1. 模态视图控制器永远不会自我贬低。发布通知,然后让导航控制器处理它。

  2. 在第二个模态视图被解除之前,您无法关闭第一个模态视图。如果这样做,您将收到EXC_BAD_ACCESS错误。将第二个模态视图视为第一个“内部”视图。如果第一个被解雇,第二个将被拖走,但它没有被解雇。

答案 2 :(得分:0)

您总是从控制器中删除模态视图,并在其中显示它(使用dismissModalViewControllerAnimated)。所以:

    导航控制器中的
  1. 在第一个模态视图控制器