两个 ModalViewController

Two ModalViewController

提问人:gabac 提问时间:10/21/2010 最后编辑:jv42gabac 更新时间:9/1/2011 访问量:3198

问:

我有一个 navigationController,我从中启动一个 ModalViewController。 在这个 ModalViewController 中,我将显示 MailComposer,它本身就是另一个 ModalViewController。

现在,如果用户点击发送按钮,则 MailComposerView 以及另一个 ModalViewController 也应该被关闭。为此,我在 mailComposerController 中调用了一个委托方法。

现在只有 MailComposerView 将被关闭,但不会关闭另一个 ModalViewController,我收到以下错误消息

attempt to dismiss modal view controller whose view does not currently appear. self = <UINavigationController: 0x724d500> modalViewController = <UINavigationController: 0x72701f0>

你知道我会做错吗?

第一个模态视图

- (void)addList {
NSLog(@"addList");

//AddListViewController *addListViewController = [[AddListViewController alloc] init];
AddListViewController *addListViewController = [[AddListViewController alloc] initWithStyle:UITableViewStyleGrouped];
addListViewController.delegate = self;

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:addListViewController];
navigationController.navigationBar.barStyle = UIBarStyleBlack;
navigationController.navigationBar.translucent = YES;
[self presentModalViewController:navigationController animated:YES];

[navigationController release];
[addListViewController release];    }

在调用 MailView 的 AddListViewController 中

MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
    mailComposer.mailComposeDelegate = self;

    NSString *subject = [NSString stringWithFormat:@"Group invite for groupname: %@", @"mhm"];
    [mailComposer setSubject:subject];

    // Fill out the email body text
    NSString *emailBody = @"This is an group invite bla bla";
    [mailComposer setMessageBody:emailBody isHTML:NO];

    [self presentModalViewController:mailComposer animated:YES];
    [mailComposer release]; 

在 mailComposerController 方法中

[self.navigationController dismissModalViewControllerAnimated:YES];
[self.delegate finishAddList:checkmark andListName:listName.text];

在 finsihAddList 委托中

[self dismissModalViewControllerAnimated:YES];
iPhone Objective-C 电子邮件 modalviewcontroller

评论


答:

3赞 jv42 10/21/2010 #1

您必须延迟调用第二个关闭,因为调用时尚未完成第一个关闭。

[self performSelector: @selector(finish:) withObject: obj afterDelay: 0.0f];

0.0f 的延迟是有意的,这意味着它将在下一个事件循环中完成。

评论

0赞 gabac 10/21/2010
尝试过但仍然收到相同的错误 [self.delegate performSelector: @selector(finishAddList:) withObject:listName.text afterDelay: 0.0f];
0赞 jv42 10/21/2010
您是否尝试过将动画删除到第二个关闭?你有没有尝试过更大的延迟?
1赞 Ryan H. 10/9/2011
我认为简单地使用延迟是危险的,因为您依赖于根据您对特定硬件(特别是特定 CPU)所做的测试设置的参数。在速度较慢的硬件上,或者如果 CPU 太忙,此延迟可能仍然不够。
1赞 jv42 10/9/2011
@HZC这不是关于硬件的知识,而是关于事件循环的知识。即使设置为 0.0f,延迟也会起作用,即使硬件速度快得离谱,因为这将在事件循环的下一次运行中有效地完成。
8赞 velocipedist 9/1/2011 #2

我也有类似的问题。我有一堆模态呈现的视图控制器。当我试图从可见的开始关闭它们,然后向下移动堆栈时,我会失败并出现同样的错误。解决方案是关闭堆栈底部的视图控制器。它会忽略它上面的一切。

在您的情况下,我的解决方案相当于更改 mailComposerController 方法,使其仅包含一行(不关闭最顶层的模态 vie 控制器)。

[self.delegate finishAddList:checkmark andListName:listName.text];

我知道你已经解决了你的问题,但认为这可能对其他人有所帮助。

评论

1赞 Ryan H. 10/9/2011
这是一个更好的解决方案,因为它不涉及时间。