2013-09-27 32 views
3

我創造應用是MFMailComposeViewController對象上轟然IOS7

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

但選擇器是零還和應用將以錯誤終止應用程序崩潰是由於未捕獲的異常'NSInvalidArgumentException',原因:'Application tried to present a nil modal view controller on target。它在模擬器中工作正常,但在設備中崩潰。 如何使用MFMailComposerViewController與IOS 7.

+0

這個崩潰可能是設備無關。我的猜測是,它沒有崩潰的設備有一個郵件帳戶配置,另一個沒有。 – jszumski

回答

10

你應該檢查是MFMailComposeViewController能夠發送你的郵件之前,試圖發送它(例如用戶不能在iOS設備上的任何郵件帳戶)。

所以你的情況爲Objective-C的:

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

if ([MFMailComposeViewController canSendMail]) { 
    myMailCompose.mailComposeDelegate = self; 
    [myMailCompose setSubject:@"Subject"]; 
    [myMailCompose setMessageBody:@"message" isHTML:NO]; 
    [self presentViewController:myMailCompose animated:YES completion:nil]; 
} else { 
    // unable to send mail, notify your users somehow 
} 

斯威夫特3:

let myMailCompose = MFMailComposeViewController() 

if !MFMailComposeViewController.canSendMail() { 
    myMailCompose.mailComposeDelegate = self 
    myMailCompose.setSubject("Subject") 
    myMailCompose.setMessageBody("message", isHTML: false) 
    self.present(myMailCompose, animated: true, completion: nil) 
} else { 
    // unable to send mail, notify your users somehow 
} 
+0

太棒了。至少不會崩潰 –

+1

最重要的是從文檔:「如果'canSendMail'方法返回'NO',則不應嘗試使用此接口。」 – jszumski

3

雖然檢查是否可以發送郵件有助於避免應用程序崩潰,這將是很好找出來,爲什麼它實際上發生。 (在我的情況下,iPhone 4S,但不是在iPhone 5相同的應用程序崩潰)

更新: 我發現下面的(如果崩潰的原因是你有意思!):MFMailComposeViewController produces a nil object 爲我所用gmail的應用程序,我沒有激活蘋果的郵件支持。看完這個我已經激活它並且... ta-da ...一切工作正常!

1

斯威夫特3+

 if !MFMailComposeViewController.canSendMail() { 
     let composeVC = MFMailComposeViewController() 
       composeVC.mailComposeDelegate = self 
       composeVC.setToRecipients(["[email protected]"]) 
       composeVC.setSubject("subject") 
       composeVC.setMessageBody("", isHTML: false) 
       self.present(composeVC, animated: true, completion: nil) 
}