Невозможно отклонить MFMailComposeViewController, делегат не вызван - PullRequest
48 голосов
/ 17 декабря 2009

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

mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult 

Вот класс табличного представления:

@implementation DetailsTableViewController
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section==0 && indexPath.row==4) {
        //SEND MAIL
        MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
        controller.mailComposeDelegate = self;
        if ([MFMailComposeViewController canSendMail]) {
            [controller setSubject:[NSString stringWithFormat:@"Ref %@",[item objectForKey:@"reference"]]];
            [controller setMessageBody:@" " isHTML:NO]; 
            [controller setToRecipients:[NSArray arrayWithObject:[item objectForKey:@"email"]]]; 
            [self presentModalViewController:controller animated:YES];
        }
        [controller release];       
    }
}

- (void)mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
    // NEVER REACHES THIS PLACE
    [self dismissModalViewControllerAnimated:YES];
    NSLog (@"mail finished");
}

Приложение не падает. После нажатия кнопки «Отмена» или «Отправить» окно «Компоновка» остается на экране с отключенными кнопками. Я могу выйти из приложения, нажав клавишу Home.

Я могу открыть другие модальные представления из TableView, но не MailCompose.

Ответы [ 4 ]

212 голосов
/ 25 декабря 2010

Убедитесь, что вы используете

controller.mailComposeDelegate = self;

а не

controller.delegate = self;
14 голосов
/ 17 декабря 2009

Неверная подпись метода:

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

Должно быть:

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
4 голосов
/ 11 марта 2014

См. Эту статью для полной реализации: http://www.ioscreator.com/tutorials/send-email-from-an-app

рабочий код после удаления устаревшего:

#import <MessageUI/MFMailComposeViewController.h>

@interface SettingsTableViewController () <MFMailComposeViewControllerDelegate, UITextFieldDelegate, UITextViewDelegate>

@end


@implementation SettingsTableViewController
// add default methods

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSInteger sectionNum = indexPath.section;
    NSInteger rowNum = indexPath.row;
    if (sectionNum == 2 && rowNum == 1) {
        MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
        controller.mailComposeDelegate = self;
        if ([MFMailComposeViewController canSendMail]) {
            [controller setSubject:[NSString stringWithFormat:@"Invitation to Northstar app"]];
            [controller setMessageBody:@" " isHTML:NO];
//            [controller setToRecipients:[NSArray arrayWithObject:[item objectForKey:@"email"]]];
            //presentViewController:animated:completion:
            [self presentViewController:controller animated:YES completion:NULL];
        }
    }
}
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{        
    NSLog (@"mail finished");
    [self dismissViewControllerAnimated:YES completion:NULL];
}

@end
0 голосов
/ 29 сентября 2016

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

В моем случае контроллер представления (скажем, «DetailsTableViewController» согласно этому вопросу), из которого я представлял MFMailComposeViewController, уже представлен из какого-либо другого контроллера представления (скажем, «BaseViewController»).

Проблема заключалась в 'modalPresentationStyle' в DetailsTableViewController при представлении его из BaseViewController.

В тот момент, когда я изменил ее с 'UIModalPresentationFormSheet' на 'UIModalPresentationPageSheet' (в этом случае проблема, отличная от 'UIModalPresentationFormSheet'), была решена, и методы делегата почтового контроллера начали работать как обычно.

Примечание: я уже вызывал метод ниже в 'DetailsTableViewController' (для этого примера), поэтому для меня не имело значения, какой 'modalPresentationStyle' я использовал.

    - (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    self.view.superview.bounds = CGRectMake(0, 0, 1024, 768);
    self.view.superview.backgroundColor = [UIColor clearColor];
}
...