2009-12-16 1 views
44

Sto chiamando MFMailComposeViewController da un UITableViewController. problema è il metodo delegato non viene mai chiamato quando seleziono Annulla o Invia pulsante in Mail comporre finestra:Impossibile chiudere MFMailComposeViewController, delegato non chiamato

mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult 

Ecco la classe di visualizzazione tabella:

@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"); 
} 

L'applicazione doesn' t crash. Dopo aver premuto il pulsante Annulla o Invia, la finestra di composizione rimane sullo schermo con i pulsanti disabilitati. Posso uscire dall'applicazione premendo il tasto Home.

Sono in grado di aprire altro modulo Viste modali TableView ma non MailCompose.

risposta

14

tua firma del metodo è corretto:

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

dovrebbe essere:

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

Credo che questo sia solo un errore di battitura nella sua domanda. –

202

Assicurarsi di utilizzare

controller.mailComposeDelegate = self; 

e non

controller.delegate = self; 
+1

Un buon consiglio, era necessario per farmi funzionare. – maralbjo

+1

+1 Grazie funziona! – Saawan

+12

Vorrei poter sopravvivere venti volte. Perché lo faresti, Apple ?! – Tim

4

, consultare questo articolo per la piena attuazione: http://www.ioscreator.com/tutorials/send-email-from-an-app

codice di lavoro dopo aver effettuato la rimozione deprecato uno:

#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

Questo articolo è molto utile: http://www.ioscreator.com/tutorials/send-email-from-an-app – Rajeev

0

Ho affrontato lo stesso problema e era alla ricerca di una correzione da ultimi 2 giorni poi ho trovato un me stesso fix e non crederai a quanto fosse piccolo.

Nel mio caso il controller di visualizzazione (ad esempio 'DetailsTableViewController' come da questa domanda) da dove stavo presentando il MFMailComposeViewController viene già presentato da qualche altro controller di visualizzazione (ad esempio 'BaseViewController').

Il problema era nel 'modalPresentationStyle' di 'DetailsTableViewController' durante la presentazione da BaseViewController.

Nel momento in cui ho cambiato da 'UIModalPresentationFormSheet' a 'UIModalPresentationPageSheet' (per quella materia qualsiasi cosa diversa da 'UIModalPresentationFormSheet') problema ottenuto risolto e metodi delegato del controller di posta ha iniziato a sparare come al solito.

Nota: stavo già chiamando il metodo seguente in 'DetailsTableViewController' (per questo esempio) quindi non mi importava davvero quale 'modalPresentationStyle' stavo usando.

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