MFMailComposeViewController - iPad - PullRequest
       4

MFMailComposeViewController - iPad

30 голосов
/ 14 февраля 2011

Я установил MFMailComposeViewController, и он отлично работает на iPhone, но на iPad он вылетает, говоря:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target...

Так зачем создавать модальное представление с нулевым значением?1005 *

Есть идеи?

Ответы [ 5 ]

73 голосов
/ 14 февраля 2011

Похоже, что MFMailComposeViewController не был создан по какой-то причине и поэтому имеет значение nil.Убедитесь, что он равен нулю, прежде чем представлять его (хотя этот обходной путь не отвечает на то, что здесь пошло не так ...).

Вам также следует выполнить проверку, может ли составитель почты отправлять почту, прежде чем пытаться создать и представить ее, используя+canSendMail метод (он возвращает NO, например, если на устройстве не настроена учетная запись почты):

 if ([MFMailComposeViewController canSendMail]){
    // Create and show composer
 }
 else{
   // Show some error message here
 }
11 голосов
/ 18 февраля 2011

Вы должны поставить отметку canSendMail, прежде чем создавать объект MFMailComposerViewController, см. Следующие комментарии класса MFMailComposeViewController.h:

/*!
@method     canSendMail
@abstract   Returns <tt>YES</tt> if the user has set up the device for sending email.
@discussion The client may continue to set the recipients and content if the return value was <tt>YES</tt>.  If <tt>NO</tt>
            was the result, the client has a couple options.  It may choose to simply notify the user of the inability to
            send mail, or it may issue a "mailto" URL via <tt>-[UIApplication openURL:]</tt>.
*/

+ (BOOL)canSendMail __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);

Ваш объект не будет инициализирован, пока ваше устройство не настроено для отправки почты.

4 голосов
/ 29 июня 2013
if ([MFMailComposeViewController   canSendMail]){
    //execute  your    code 
else{
    UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"No mail account setup on device" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];     
    [anAlert addButtonWithTitle:@"OK"];
    [anAlert show];
}

Если вы получаете оповещение, настройте свою почтовую учетную запись на телефоне.

2 голосов
/ 16 апреля 2013

Это происходит потому, что ваше почтовое приложение по умолчанию на iOS еще не настроено с каким-либо почтовым идентификатором.так что настройте с любым вашим почтовым идентификатором и попробуйте.

вот так

if ([MFMailComposeViewController canSendMail]){
    MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
    controller.mailComposeDelegate = self;
    [controller setToRecipients:[NSArray arrayWithObject:eMail]];
    [self presentViewController:controller animated:YES completion:nil];
}
else{
    UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"error" message:@"No mail account setup on device" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    [anAlert addButtonWithTitle:@"Cancel"];
    [anAlert show];
}

надеюсь, это поможет вам.

0 голосов
/ 16 декабря 2014

На вашем тестовом устройстве не настроена учетная запись электронной почты.

if ([MFMailComposeViewController canSendMail]){

//execute your code else{
UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"error" message:@"No mail account setup on device" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    [anAlert addButtonWithTitle:@"Cancel"];
    [anAlert show];
}
...