2010-11-25 4 views
4

Я пытаюсь включить MFMailComposeViewController в свое приложение. Когда я представляю это модально, кнопка отправки работает нормально и отправляется электронное письмо, что означает, что результат, отправленный делегату, в этом случае прав.Лист действия не отображается при нажатии кнопки отмены 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:@"[email protected]"]; 

    [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:[email protected][email protected],[email protected]&subject=illusions!"; 
NSString *body = @"&body=xyz"; 

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

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

ответ

0

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

+0

Я знаю, он отлично работает и с другими видами моего приложения. Но, по этому мнению, таблица действий никогда не появляется! Является ли это причиной того, что мой взгляд уже является модальным? – Anam 2010-11-25 09:42:56

7

метод

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

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

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

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

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

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

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

1

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

0

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

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

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

1

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

0

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

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

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

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

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

Смежные вопросы