2009-12-16 14 views
44

Dzwonię pod numer MFMailComposeViewController z UITableViewController. Problem jest metoda delegata nigdy nie jest wywoływana, gdy wybiorę Anuluj lub Wyślij przycisk Poczta komponować okno:Nie można zwolnić MFMailComposeViewController, delegat nie zadzwonił pod numer

mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult 

Oto klasa widoku tabeli:

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

Aplikacja robi” t crash. Po naciśnięciu przycisku Anuluj lub Wyślij okno Kompozycji pozostaje na ekranie z wyłączonymi przyciskami. Mogę wyjść z aplikacji naciskając klawisz Home.

Jestem w stanie otworzyć inne widoki modalne z widoku TableView, ale nie MailCompose.

Odpowiedz

14

Twój podpis metoda jest błędna:

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

Powinno być:

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

Uważam, że to tylko literówka w jego pytaniu. –

202

Używaj

controller.mailComposeDelegate = self; 

a nie

controller.delegate = self; 
+1

Dobra wskazówka, była mi potrzebna, aby ją uruchomić. – maralbjo

+1

+1 Dzięki to działa! – Saawan

+12

Chciałbym, aby udało mi się wygrać dwadzieścia razy. Dlaczego miałbyś to zrobić, Apple ?! – Tim

4

zobacz ten artykuł do pełnej realizacji: http://www.ioscreator.com/tutorials/send-email-from-an-app

kod działa po dokonaniu usuwanie nieaktualnych jednego:

#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

Ten artykuł jest bardzo pomocny: http://www.ioscreator.com/tutorials/send-email-from-an-app – Rajeev

0

I w obliczu tego samego problemu i szukał fix z ostatnich 2 dni później znalazłem naprawić sobie i nie uwierzycie, jak niewielkie było to.

W moim przypadku kontroler widoku (powiedzmy „DetailsTableViewController” jak na to pytanie) skąd ja prezentując MFMailComposeViewController jest już przedstawiony z innego kontrolera widoku (powiedzmy „BaseViewController”).

Problem był w "modalPresentationStyle" z "DetailsTableViewController" podczas prezentacji go z BaseViewController.

W momencie, kiedy zmienił go z „UIModalPresentationFormSheet” do „UIModalPresentationPageSheet” (zresztą niczego innego niż „UIModalPresentationFormSheet”) problem został rozwiązany i metody delegata kontroler elektronicznej zaczęli strzelać jak zwykle.

Uwaga: Już wywoływałam poniższą metodę w "DetailsTableViewController" (dla tego przykładu), więc nie miało to dla mnie znaczenia, który "modalPresentationStyle" używałem.

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