iOS 7:在navigationController上呈现MFMailComposeViewController时的空白屏幕

时间:2014-06-15 15:19:36

标签: ios iphone objective-c email mfmailcomposeviewcontroller

我有一个使用故事板构建的应用程序,navigationController,到目前为止我遇到的唯一一个我无法解决的问题是提供一个屏幕来发送带有CSV附件的电子邮件

就我环顾四周而言,一切都应该没问题,应用程序不会崩溃,它只是向我显示一个白色屏幕,它应该向我显示邮件编辑器视图控制器。

在我的ListViewController.h(不是主控制器,但是MainViewController.h是)中,我有:

#import <UIKit/UIKit.h>
#import "MainViewController.h"
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

@interface ListViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, UIPickerViewDelegate, UIActionSheetDelegate, MFMailComposeViewControllerDelegate>

...

- (IBAction) exportCSVToEmail;
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error;

@end

在我ListViewController.m中,我得到了:

@implementation ListViewController

...

// Export CSV to email and send it
- (IBAction) exportCSVToEmail
{
    ...

    if ( [MFMailComposeViewController canSendMail] ) {
        MFMailComposeViewController *mailComposeViewController = [[MFMailComposeViewController alloc] init];
        mailComposeViewController.mailComposeDelegate = self;
        [mailComposeViewController setSubject:emailSubject];
        [mailComposeViewController setMessageBody:emailBody isHTML:NO];
        [mailComposeViewController addAttachmentData:textFileContentsData mimeType:@"text/csv" fileName:csvFileName];
        [mailComposeViewController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
        [self.navigationController presentViewController:mailComposeViewController animated:YES completion:^{
            //[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
            NSLog(@"Completed showing the mail view!");
        }];
    } else {
        ...
    }
}

#pragma mark MFMailComposeViewControllerDelegate
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    NSLog(@"Finished sending email!");
    [self dismissViewControllerAnimated:YES completion:nil];
}

...

我正在我的设备上尝试此操作(我已设置了邮件帐户)。

这个问题似乎没有出现在附件或类似内容中(我尝试使用简化版本进行评论,但问题是相同的)。

看起来我要么没有在正确的位置展示视图控制器,要么我在故事板中遗漏了什么?

我确实在控制台中看到了"Completed showing the mail view!",并且没有任何错误,只有一个空白的白色屏幕(状态栏为黑色,我可以使用注释行自定义它)。

这仅适用于iOS7,顺便说一句。

帮助? :/

更新

经过其他用户的一些尝试和建议后,似乎无论我在presentViewController:animated:completion放入什么viewController,它总是显示一个空白屏幕。它是“空白”的事实与我在AppDelegate.m中定义的窗口主图层上的渐变有关:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    // Add background gradient
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = self.window.bounds;
    gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor colorWithRed:0.878431373 green:0.878431373 blue:0.878431373 alpha:1] CGColor], nil];
    [self.window.layer insertSublayer:gradient atIndex:0];
    ...
    return YES;
}

更新2:

这是我的故事板上的一些设置......也许我没有看到什么......

storyboard screenshot #1 storyboard screenshot #2

更新3:

我已经尝试了一个带导航控制器的简单应用程序和一个可以启动电子邮件并且没有问题的视图。我正在试图找出我的应用程序中的内容,它不允许发生相同的事情......

2 个答案:

答案 0 :(得分:1)

我已经弄明白了这个问题,非常感谢你的帮助@Vibin和@rdelmar!

问题发生在我的AppDelegate.m中,我在那里:

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.window.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor colorWithRed:0.878431373 green:0.878431373 blue:0.878431373 alpha:1] CGColor], nil];
[self.window.layer insertSublayer:gradient atIndex:0];

似乎人们无法对故事板应用程序的窗口做任何事情?

无论如何,现在我可能会将渐变添加到每个视图控制器而不是在窗口中显示:)

非常感谢你!

答案 1 :(得分:0)

我同意rdelmar。我尝试使用故事板创建一个示例应用程序,其中一个空白控制器嵌入在导航控制器中。将我的控制器类映射到storyboard视图控制器,并将我的代码复制粘贴到我的控制器类的viewDidLoad中。我没有评论你的任何一行。我能够在模拟器上看到电子邮件屏幕,其中包含所有详细信息。

出于调试目的,您可以尝试以下方法之一:

(1)。尝试将电子邮件屏幕设置为故事板中导航控制器的第一个屏幕(根视图控制器)并加载它。

(2)。从ListViewController中拉出代码并将其移动到一个单独的UIViewController类,该类只实现MFMailComposeViewControllerDelegate及其功能。将您的电子邮件控制器类映射到此新类,然后尝试加载它。

请分享您的观察结果。