我对取消模态视图感到困惑:
案例1:我有一个导航视图控制器,我从这个导航视图控制器呈现一个模态视图控制器。现在,当我要从哪里取消这个模态视图时,我应该调用dismissModalView方法 - 导航视图控制器还是模态视图控制器?
案例2:我有一个模态视图控制器,我从第一个模态视图控制器呈现另一个模态视图控制器。现在,当我要从哪里取消第二个模态视图时,我应该调用dismissModalView方法 - frist模态视图控制器还是第二个模态视图控制器?
从错误的地方取消会导致应用程序崩溃吗?
答案 0 :(得分:1)
应用程序崩溃是因为当您尝试关闭模态视图控制器时,相应视图控制器的范围丢失,可能是您在解除之前释放了视图控制器
答案 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];
}
回到父视图控制器中,你应该监听这个通知,然后在发布通知时关闭模态视图。
那就是说,回答你的问题:
模态视图控制器永远不会自我贬低。发布通知,然后让导航控制器处理它。
在第二个模态视图被解除之前,您无法关闭第一个模态视图。如果这样做,您将收到EXC_BAD_ACCESS错误。将第二个模态视图视为第一个“内部”视图。如果第一个被解雇,第二个将被拖走,但它没有被解雇。
答案 2 :(得分:0)
您总是从控制器中删除模态视图,并在其中显示它(使用dismissModalViewControllerAnimated)。所以: