【问题标题】:Two ModalViewController两个 ModalViewController
【发布时间】:2010-10-21 14:17:59
【问题描述】:

我有一个导航控制器,我从那里启动一个 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];    }

在 AddListViewController 中调用 MailView

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 email modalviewcontroller


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这是一个更好的解决方案,因为它不涉及计时。
    【解决方案2】:

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

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

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

    【讨论】:

    • 试过了,但仍然得到同样的错误 [self.delegate performSelector: @selector(finishAddList:) withObject:listName.text afterDelay: 0.0f];
    • 您是否尝试过将动画移除到第二次关闭?您是否尝试过更大的延迟?
    • 我认为简单地使用延迟是危险的,因为您依赖于根据您对特定硬件(特别是特定 CPU)进行的测试设置的参数。在较慢的硬件上,或者如果 CPU 太忙,这个延迟可能仍然不够。
    • @HZC 这不是关于硬件知识,而是关于事件循环的知识。即使设置为 0.0f,即使硬件速度快得离谱,延迟也会起作用,因为这将在事件循环的下一次运行时有效地完成。
    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    相关资源
    最近更新 更多