Подтвердить что ты не робот

MFMailComposeViewController - iPad

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

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

Итак, почему это создало бы ноль модальный вид?

    MFMailComposeViewController *message = [[MFMailComposeViewController alloc] init];
    [message setMessageBody:@"My message here"  isHTML:NO];
    [message setToRecipients:[NSArray arrayWithObject:@"[email protected]"]];
    [message setSubject:@"Request Info"];
    message.mailComposeDelegate = self;
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        message.modalPresentationStyle = UIModalPresentationFormSheet;
    [self presentModalViewController:message animated:YES];
    [message release];

Любые идеи?

4b9b3361

Ответ 1

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

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

 if ([MFMailComposeViewController canSendMail]){
    // Create and show composer
 }
 else{
   // Show some error message here
 }

Ответ 2

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

/*!
@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);

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

Ответ 3

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];
}

Если вы получаете предупреждение, настройте свою учетную запись электронной почты на своем телефоне.

Ответ 4

Случается, что ваше почтовое приложение по умолчанию для 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];
}

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

Ответ 5

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

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];
}