处理 MFMailComposeViewController 不会带回我在 iPhone 上的旧视图,但可以在 iPad 上使用

Posted

技术标签:

【中文标题】处理 MFMailComposeViewController 不会带回我在 iPhone 上的旧视图,但可以在 iPad 上使用【英文标题】:Disposing MFMailComposeViewController wont bring back my old view on iPhone but works on iPad 【发布时间】:2011-10-07 08:26:11 【问题描述】:

我是 iPhone/iPad 开发的新手,我在使用 Unity3d 的插件时遇到了一些问题。

插件弹出一个 MFMailComposeViewController 并允许用户从游戏中发送电子邮件。当用户完成后,窗口应该会消失并且游戏会继续运行。

这在 iPad 上按预期工作,但在 iPhone 上不工作。

在 iPhone 上移除窗口后,游戏不会重新获得控制权。图形仍在渲染,但无法判断游戏是否仍在运行或只是静止图像(因为它位于没有动态图形的菜单中)

下面是一些如何完成的代码:

-(IBAction)launchEmailView:(NSString*)address subject:(NSString*)subject message:(NSString*)message 
    customUIViewController = [[InAppEmailViewController alloc] init];
    [[self getTopApplicationWindow] addSubview:customUIViewController.view];

    MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];

    [controller setSubject:subject];
    [controller setToRecipients:[NSArray arrayWithObject:address]];
    [controller setMessageBody:message ishtml:NO];
    [controller.navigationBar setTintColor:[UIColor redColor]];

    [customUIViewController presentModalViewController:controller animated:YES];
    controller.mailComposeDelegate = self;
    [controller release];




-(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
    [customUIViewController dismissModalViewControllerAnimated:YES];
    [customUIViewController.view removeFromSuperview];
    [customUIViewController release];
    controller = nil;

阅读文档我只能假设这与此有关:

presentModalViewController:动画: 向用户呈现由给定视图控制器管理的模态视图。

在 iPhone 和 iPod touch 设备上,modalViewController 的视图总是全屏显示。在 iPad 上,显示取决于 modalPresentationStyle 属性中的值。

问题不在于 iPad,所以我的猜测是我需要在全屏模式下以不同的方式处理这个问题?

任何帮助将不胜感激。

问候, 尼克拉斯

[编辑]

经过反复评论,我决定添加查找topWindow的功能

-(UIWindow*)getTopApplicationWindow

    UIApplication* clientApp = [UIApplication sharedApplication];
    NSArray* windows = [clientApp windows];
    UIWindow* topWindow = nil;

    if (windows && [windows count] > 0)
            topWindow = [[clientApp windows] objectAtIndex:0];

    return topWindow;

【问题讨论】:

我在您的代码中看到的添加 modalViewControllers 的唯一异常是 [[self getTopApplicationWindow] addSubview:customUIViewController.view];你为什么这样做?这很可能会导致您的问题。 这是我正在使用的插件。我不是自己构建的,而且我是 Objective-C 的初学者,所以我真的不知道为什么要这样做。我认为这是必要的,所以我没有尝试删除它。我现在就这样做。 这实际上是插件工作所必需的。由于该插件是从 Unity3d 调用的,我想我需要找到要附加到的正确窗口。 你会弄明白的^^ 但是如果你想看到一个工作的 modalViewController 原型检查这个问题(在第一次编辑中)。 ***.com/questions/7607271/… 谢谢,我去看看:) 【参考方案1】:

您应该使用以下方式呈现邮件编写器:

[self presentModalViewController:controller animated:YES];

在你的委托方法中你应该调用:

[self dismissModalViewControllerAnimated:YES];

都假设selfUIViewController

【讨论】:

以上是关于处理 MFMailComposeViewController 不会带回我在 iPhone 上的旧视图,但可以在 iPad 上使用的主要内容,如果未能解决你的问题,请参考以下文章

HttpApplication处理对象与HttpModule处理模块

自然语言处理_一般处理流程

怎么在批处理中加回车命令?

throws关键字_异常处理的第一种方式(交给别人处理)和try_catch_异常处理的第二种方式(自己处理)

PHP异常处理

协处理器,王明学learn