Лист действий не отображается при нажатии кнопки отмены MFMailComposeViewController - PullRequest
4 голосов
/ 25 ноября 2010

Я пытаюсь включить MFMailComposeViewController в свое приложение.Когда я представляю это модально, кнопка отправки работает нормально, и электронное письмо отправляется, что означает, что результат, отправленный делегату, является правильным в этом случае.

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

(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error

никогда не вызывается при каждом нажатии кнопки отмены.Вероятно, это причина, по которой лист действий ( Сохранить черновик , отменить , удалить черновик ) не отображается и, следовательно, приложение зависает прямо там.

Я использую точный код из примеров приложений Apple ( MailComposer ), он отлично работает там, но как-то не получается в моем.: (

Пожалуйста, помогите мне, если кто-нибудь когда-либо сталкивался с той же проблемой и успешно решил ее.

Мой код:

  -(IBAction)emailButtonPressed:(id)sender{

           Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
       if (mailClass != nil)
          {

          if ([mailClass canSendMail])
            {
              [self displayComposerSheet];
            }
          else
            {
              [self launchMailAppOnDevice];
            }
          }
        else
          {
            [self launchMailAppOnDevice];
          }


}


#pragma mark -
#pragma mark Compose Mail


-(void)displayComposerSheet 
{
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;

    [picker setSubject:@"Ilusiones"];


    // Set up recipients
     NSArray *toRecipients = [NSArray arrayWithObject:@"anam@semanticnotion.com"]; 

     [picker setToRecipients:toRecipients];
     // Attach a screenshot to the email      
     UIGraphicsBeginImageContext(self.view.bounds.size);
     [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
     UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();

         NSData *myData = UIImagePNGRepresentation(viewImage);
     [picker addAttachmentData:myData mimeType:@"image/png" fileName:@"viewImage"];



     // Fill out the email body text
     NSString *emailBody = @"";
     [picker setMessageBody:emailBody isHTML:NO];

     [self presentModalViewController:picker animated:YES];
         [picker release];

 }

 - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
 {  

  switch (result)
  {
case MFMailComposeResultCancelled:
    NSLog(@"Result: canceled");
    break;
case MFMailComposeResultSaved:
    NSLog(@"Result: saved");
    break;
case MFMailComposeResultSent:
    NSLog( @"Result: sent");
    break;
case MFMailComposeResultFailed:
    NSLog( @"Result: failed");
    break;
default:
    NSLog(@"Result: not sent");
    break;
 }
 [self dismissModalViewControllerAnimated:YES];
}


#pragma mark -
#pragma mark Workaround


-(void)launchMailAppOnDevice
{
NSString *recipients = @"mailto:anam@semanticnotion.com.com?cc=second@example.com,third@example.com&subject=illusions!";
NSString *body = @"&body=xyz";

NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body];
email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];
}

Ответы [ 6 ]

7 голосов
/ 16 мая 2011

Метод

(void)mailComposeController:(MFMailComposeViewController*)controller
        didFinishWithResult:(MFMailComposeResult)result
                      error:(NSError*)error

никогда не вызывается, потому что вы не нажимаете никакую кнопку UIActionSheet после отмены, так как она не отображается на экране.

Причина, по которой это происходит, в том, что UIActionSheet появляется за кадром. Если вы проверите журнал отладки, вы, вероятно, увидите сообщение «1008» «Представление листа действий», вырезанного из его суперпредставления. Некоторые элементы управления могут не реагировать на прикосновения. На iPhone попробуйте -[UIActionSheet showFromTabBar:] или -[UIActionSheet showFromToolbar:] вместо -[UIActionSheet showInView:]. "

Вот почему вы видите, что ваш вид становится темнее, но UIActionSheet не появляется.

В моем случае проблема заключалась в том, что мое приложение было универсальным, но по какой-то причине был только один MainWindow.xib, и он был больше, чем размер экрана iPhone (фактически это был размер экрана iPad).

Решение состоит в том, чтобы создать еще один MainWindow-iPhone.xib с правильными размерами и изменить записи в Info.plist с именами Основная база файлов перьев (iPad) и Основная база файлов перьев (iPhone) чтобы они указывали на нужный файл. Проблема решена!

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

1 голос
/ 12 июня 2013

У Msoler все правильно, лист действий отображается вне экрана. MFMailComposeViewController отображает лист действий в x: y 0: 0, поэтому вы должны убедиться, что вызывающий кадр контроллера равен 0: 0. У меня была похожая проблема, когда я пытался отобразить MFMailComposeViewController из представления, встроенного в представление с прокруткой.

1 голос
/ 06 июня 2012

У меня была такая же проблема, закомментировал '[picker release];', и она работала нормально!Объяснение?У меня нет ни одного.

0 голосов
/ 17 августа 2015

На всякий случай, если кто-то еще совершит ту же ошибку, что и я ... Я реализовал метод mailComposeController:didFinishWithResult:error: в своем коде Swift. Некоторое время он работал, но после нескольких рефакторингов я заметил, что его больше не вызывают. В конце концов я заметил, что метод принял эту форму в моем коде:

private func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) {
    presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
} 

Итак, как вы можете видеть, я был слишком заинтересован в приватизации моих методов: поскольку метод помечен @optional в MFMailComposeViewControllerDelegate, вам не нужно его реализовывать. И хотя я на самом деле реализовал его, модификатор private оттуда скрыл реализацию - таким образом, из-за пределов файла казалось, что этот метод вообще не был реализован! Однако, поскольку метод был необязательным, компилятор не жаловался ...

В заключение: не отмечайте необязательный делегат с модификатором private.

С тех пор, как я изучал Swift, я удивлялся, почему больше нет дополнительных методов - теперь я мог бы понять; -).

0 голосов
/ 21 февраля 2013

Убедитесь, что вы используете правильный метод,

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

У меня был какой-то подобный реализованный метод, который никогда не вызывался.Я понятия не имею, что именно у меня было, но компилятор не выдал мне предупреждение или сообщение об ошибке.

0 голосов
/ 25 ноября 2010

Я реализовал тот же код. Работает абсолютно нормально. Когда вы нажимаете кнопку удаления черновика, вызывается метод didFinishWithResult, и почта отменяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...