2016-12-26 13 views
0

У меня есть класс, который подкласс NSObject с функцией выполняет отображение MFMailComposeViewController. Вот код:MFMailComposeViewController не уходит с кнопкой Отмена

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

mailController.mailComposeDelegate = self; 
[mailController setSubject:@"Sample Subject"]; 
[mailController setMessageBody:@"Here is some main text in the email!" isHTML:NO]; 
[mailController setToRecipients:@[self.email]]; 

UITabBarController *tabbarController = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController; 
UINavigationController *navigationController = tabbarController.selectedViewController; 
[navigationController.topViewController presentViewController:mailController animated:YES completion:NULL]; 

Все работает хорошо с этим кодом. Проблема в том, когда я хочу отклонить MFMailComposeViewController. Когда-то я получаю сбой, иногда просто ничего не происходит. Я реализовал функцию делегата:

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error { 
    UITabBarController *tabbarController = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController; 
    UINavigationController *navigationController = tabbarController.selectedViewController; 
    [navigationController.topViewController dismissViewControllerAnimated:YES completion:nil]; 
} 

После этого я попытался показать, и уволить его directlty из ViewController и все работает. Даже кнопка отмены.

Я не знаю, почему он работает в моем классе ViewController, но не в моем подклассе NSObject.

Когда я получаю аварии я видел в журналах:

-[MFMailComposeInternalViewController _notifyCompositionDidFinish] 
+0

Есть вы добавляете MFMailComposeViewDelegat e в файле заголовка ...? –

+0

Да, да. Ну, я добавил его в файл .m, но это то же самое. –

+0

Опубликуйте информацию, связанную с журналом сбоев, для получения дополнительной помощи. –

ответ

0

Попробуйте это,

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error 
{ 
    // Do your work and dismiss after you are done with it. 
    [controller dismissViewControllerAnimated:YES completion:nil]; 
} 

Надежда, что помогает.

+0

Спасибо за ваш комментарий Naresh, но я забыл указать, что метод делегата не вызывается. –

+0

Назначенный делегат там, представляя почтовый композитор? –

0

Попробуйте это в вашем классе одноплодной

UIViewController *currentViewController; 

    - (void)sendEmail:(id) viewController { 

currentViewController=(UIViewController*)viewController; 

     NSString * appVersionString [email protected]""; 
     NSString *[email protected]""; 
     NSString *[email protected]""; 


     NSArray *toRecipents [email protected]""; 



     if ([MFMailComposeViewController canSendMail]) { 

      MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init]; 
      mc.mailComposeDelegate =viewController; 
      [mc setSubject:strEmailSubject]; 
      [mc setMessageBody:strEmailMessage isHTML:NO]; 
      [mc setToRecipients:toRecipents]; 


      [viewController presentViewController:mc animated:YES completion:NULL]; 


     } 
     else{ 
      UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Error" message:@"Please setup email account" delegate:nil cancelButtonTitle:@"cancle" otherButtonTitles:nil]; 

      [alert show]; 
     } 

    } 

набор делегата, как это

mc.mailComposeDelegate =viewController; 

в dissmiss ViewController

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

       break; 
      case MFMailComposeResultSaved: 
       break; 
      case MFMailComposeResultSent: 

       break; 
      case MFMailComposeResultFailed: 

       break; 
     } 

     // Close the Mail Interface 
     [currentViewController dismissViewControllerAnimated:YES completion:NULL]; 
    } 

я надеюсь, что это будет работать ...

+0

Dhiru. Хорошо, но я должен поместить метод делегата в класс ViewController. Я не могу установить класс NSObject в качестве делегата. Так странно. –

+0

вы можете написать этот метод в класс AppDelegate.m и реализовать весь протокол делегата, и установите делегат на «я», вы сможете использовать его со всех ViewController, если вы импортируете AppDelegate.h в свой ViewController. – Dhiru