2014-09-22 15 views
9

Wenn ich Xcode 6 ausführen und den iOS 8-Simulator verwenden, versuche ich einen MFMailComposeViewController zu laden, es wird nicht angezeigt. Stattdessen bekomme ich diesen Fehler ...MFMailComposeViewController wird nicht in iOS 8 angezeigt

„Warnung: Versuch MFMailComposeViewController vorstellen: 0x7c30c400 auf Viewcontroller: 0x7baf6000, die bereits (null) präsentiert“

Der exakt gleiche Code für fast ein Jahr wurde nun arbeiten, unverändert. Nur um sicher zu sein, ich lief meine App in Xcode 6 mit dem iOS 7.1-Simulator und es funktionierte wie zuvor, perfekt.

Kann jemand eine MFMailComposeViewController Ansicht in iOS 8 anzeigen? Das scheint eine einfache Aufgabe zu sein und ich bin sicher, es ist eine einfache Lösung.

PS. Posting ist nicht erforderlich, da es Standard-Code ist aber hier ist es trotzdem ...

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

picker.mailComposeDelegate = self; 

//Current Date 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
NSDate *date = [NSDate date]; 
//Ensure UTC DATE 
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
[formatter setDateFormat:@"MM/dd/yyyy 'at' HH:mm:ss UTC"]; 
NSString *myString = [formatter stringFromDate:date]; 

NSString *emailBody = [NSString stringWithFormat:@"Feedback time at %@.<br><br>Name:", myString]; 
[picker setMessageBody:emailBody isHTML:YES]; 

NSString *subject, *emailAddress; 

[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
[formatter setDateFormat:@"MM/dd/yyyy"]; 
subject = [NSString stringWithFormat:@"Feedback"]; 

//Set the Subject 
[picker setSubject:subject]; 

emailAddress = @"[email protected]"; 

//Set the Receivers 
NSArray *myReceivers = [[NSArray alloc] initWithObjects:emailAddress, nil]; 
[picker setToRecipients:myReceivers]; 

//It saves the file name as the same as Subject here! 
picker.navigationBar.barStyle = UIBarStyleDefault;//UIBarStyleBlack; 
[self presentViewController:picker animated:YES completion:^{}]; 

Antwort

5

Ich war ein ähnliches Problem haben, aber nicht die gleiche Nachricht erhalten haben. Unter iOS 8 wurde jedoch mein Mail Composer nicht angezeigt. Ich startete es von einem Knopf auf einem UIPover. Ich würde die Mail Komponist zeigen und dann ein paar Zeilen Code später rief ich:

[myPopover dismissPopoverAnimated:YES]; 

Ein anderer Thread auf Stackoverflow darauf hingewiesen, dass vielleicht hatte es etwas mit einem anderen View-Controller aktiv zu tun. Also zog ich meine entlassen popover über dem anderen Aufruf der Mail-Composer zu zeigen und machte es auch nicht animiert:

[aboutPopover dismissPopoverAnimated:NO]; 

Jetzt funktioniert es.

+0

Das war, was es war. Ich präsentierte es auch von einem UIPover und ich fügte die Linie hinzu, um es vor dem Öffnen des MailComposer zu entlassen, und es hat funktioniert! danke – Airtower

-1

Hier ist der Code verwende ich die Mail-Composer anzuzeigen, und es funktioniert gut auf meine Version von Xcode 6.0.1 und mein Gerät (iPhone 5 mit iOS8):

-(void) showMailComposer { 
    if(![MFMailComposeViewController canSendMail]) { 
     NSLog(@"Cannot send mail\n%s", __PRETTY_FUNCTION__) ; 
     return ; 
    } 

    // Email Subject 
    NSString *emailTitle = @"Test Email"; 
    // Email Content 
    NSString *messageBody = @"iOS programming is so fun!"; 
    // To address 
    NSArray *toRecipents = [NSArray arrayWithObject:@"[email protected]"]; 

    MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init]; 
    mc.mailComposeDelegate = self; 
    [mc setSubject:emailTitle]; 
    [mc setMessageBody:messageBody isHTML:NO]; 
    [mc setToRecipients:toRecipents]; 

    // Present mail view controller on screen 
    [self presentViewController:mc animated:YES completion:NULL]; 
} 
+0

Ich habe versucht, das Kopieren und Einfügen genau diesen Code und es verwenden, aber ich bekomme genau die gleichen Fehler. – Airtower

+0

Es mag lange dauern, aber haben Sie die neueste Version von Xcode? – ElectrikSheep

0

die MFMailComposeViewController funktioniert nicht mehr auf dem iOS 8 Simulator.

Wenn Sie auf einem physischen Gerät versucht, können Sie versuchen, präsentieren nur den Picker ohne weitere Änderungen wie folgt:

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 
[self presentViewController:picker animated:YES completion:nil]; 

Sein vermutlich auch lohnt, was [MFMailComposeViewController canSendMail] kehrt

+0

Ich habe es auf dem Gerät ohne Glück versucht. – Airtower

+0

Ich habe es gerade noch einmal auf einem anderen iPad ohne Glück versucht. – Airtower

+0

@Airtower Was gibt '[MFMailComposeViewController canSendMail]' zurück? Hast du versucht, einfach die beiden obigen Codezeilen auszuführen? Erhalten Sie Nachrichten in der Konsolenausgabe? Hast du einen Unfall? Importieren Sie MessageUI? '@import MessageUI;' – liamnichols

1

Ich weiß nicht, warum das funktioniert hat. Ich präsentiere keine anderen Viewcontrollers vor, diese Methode zu nennen, aber wenn ich entlassen Viewcontrollers zuerst funktioniert es ...

[self dismissViewControllerAnimated:YES completion:^{ 
    [self presentViewController:picker animated:YES completion:^{}]; 
}]; 
+0

Dies konnte das Problem für mich nicht lösen. – andygeers

+0

Das ist seltsam genug! Es funktioniert auch für mich. –

0

Hatte das gleiche Problem, scheint wie das SDK8.0 erstellt MFMailComposeController als PopOver in IOS8, so dass Sie alle anderen popOver entlassen müssen. Hier ist ein Beispiel, wie es funktioniert.

-(void)sendMail{ 
    [[[self fatherController] sharePopOver] dismissPopoverAnimated:YES]; 
    MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init]; 
    [controller setMailComposeDelegate:[self fatherController]]; 
    [[self fatherController] presentViewController:controller animated:YES completion:NULL]; 
} 
+0

auch dieses Problem findet nur in ipad statt, da es keine popovers in iphone/ipod gibt – user2387149

0

Hatte dasselbe Problem mit UIActionSheet. MFMailComposeViewController wird nicht angezeigt, während UIActionSheet vorhanden ist (nur unter iOS 8). Selbst wenn Sie es ohne Animationen ablehnen. Warten auf 1 Sekunde behebt das Problem beschämend. Also habe ich UIAlertController (eingeführt in iOS 8) für neue Geräte und UIActionSheet für alte verwendet. Ich habe jetzt einen hässlichen und sehr langen Code, dank Apple.

+1

Hallo, löste ich das Problem mit UIActionSheet. Ich habe den MFMailComposeViewController in einer anderen UIActionSheetDelegate-Callback-Funktion angezeigt '- (void) actionSheet: (UIActionSheet *) actionSheet didDismissWithButtonIndex: (NSInteger) buttonIndex'. –

0

Der MailComposer funktioniert nicht am Simulator, aber er funktioniert mit Geräten (iOS 8).

6

Ich hatte ein ähnliches Problem auf iOS 8, die auf iOS 7 und davor gut funktionierte.

Ich präsentierte meine MFMailComposeViewController nach dem Benutzer eine Taste in UIActionSheet drücken. Also, in früheren Implementierung, lege ich die E-Mail Komponisten und zeige MFMailComposeViewController in UIActionSheetDelegate Funktion:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 

, die mit dem Funktionsnamen einfach war.

Aber möglicherweise durch einige UI-Animation Konflikt verursacht, zeigt MFMailComposeViewController und UIActionSheet zur gleichen Zeit macht MFMailComposeViewController nicht gezeigt.

  • Lösung

Meine Lösung setzt MFMailComposeViewController zeigt in UIActionSheetDelegate Funktion:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex 

, die nach der UIActionSheet Animation aufgerufen wird.

Ich wünschte, dies könnte jemandem helfen, der das gleiche Problem hat.

+0

Dieser Fix funktionierte auch für mich in iOS 9.2 –

0

Im popover func genau das tun

@IBAction func exportAsMail(sender: AnyObject) { 

    NSNotificationCenter.defaultCenter().postNotificationName("exportAsMail", object: nil) 

    self.dismissViewControllerAnimated(false, completion: nil) 
    ///****animated have to be false not true 


} 
Verwandte Themen