2011-09-29 3 views
0

La question concerne une application qui utilise plusieurs vues dans un style de contrôleur UINavigation.MFMailComposeViewController dans le délégué

J'ai une fonction simple dans mon délégué qui peut être utilisé par toutes les vues pour tracer-out message d'erreur

// Dans Appdelegate.m

-(void)popErrorWindow:(NSString *)theError 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:theError 
                delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Report",nil]; 
    [alert show]; 
    [alert release]; 
} 


- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
     if (buttonIndex == 1) 
     { 
      NSLog(@"report"); 
      [self mailIt:@"error name"]; 
     } 
    } 

Maintenant, voulant avoir un mécanisme enverra par courrier électronique l'erreur ainsi que d'autres données que j'ai créé ceci:

-(void)mailIt:(NSString *)theError { 
    NSLog(@"Mail it"); 
    pickerMail = [[MFMailComposeViewController alloc] init]; 
    pickerMail.mailComposeDelegate = self; 

    [pickerMail setSubject:@"error via email"]; 

NSMutableString *body = [NSMutableString string]; 

    [body appendString:@"Error XXX "]; 

    [pickerMail setMessageBody:body isHTML:YES]; 


    // Problem here: 
    [self.window presentModalViewController:pickerMail animated:YES]; 
} 

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

{ 
    // Problem here: 
    [self.window dismissModalViewControllerAnimated:YES]; 
    //NSLog(@"mail was sent"); 
} 

le problème est dans self.window, ce qui est la bonne façon d'y accéder depuis le délégué, Je veux toujours avoir l'élément mail dans le délégué car toutes les vues peuvent appeler l'alerte d'erreur, et je voudrais avoir seulement une place pour ce mécanisme.

Comment dois-je le faire depuis l'intérieur du délégué, qu'est-ce qui devrait remplacer la self.window?

Répondre

1
- (void)mailComposeController:(MFMailComposeViewController *)controller 
      didFinishWithResult:(MFMailComposeResult)result 
         error:(NSError *)error 
{ 
    [controller dismissModalViewControllerAnimated:YES]; 
} 

EDIT:

Les - (void)presentModalViewController:(UIViewController *)vc et - (void)dismissModalViewControllerAnimated:(BOOL)animated méthodes sont une méthode d'instance UIViewController, de sorte que vous ne pouvez pas l'utiliser avec un UIWindow.

Afin de présenter votre contrôleur de messagerie avec une belle animation, vous pouvez le faire:

UIViewController *aController = self.navigationController.presentedViewController; 
[aController presentModalViewController:pickerMail animated:YES]; 
+0

qu'en est-il de: [self.window presentModalViewController: pickerMail animé: YES]; – chewy

+0

J'ai édité ma réponse – klefevre

+0

Merci jusqu'à présent kl94, En ajoutant: [self.navigationController.parentViewController presentViewController: pickerMail]; Je reçois une erreur: Problème sémantique: Méthode '-presentViewController:' not found (le type de retour par défaut est 'id') – chewy

2

réimplémentant Peut-être popErrorWindow: et mailIt: dans un category sur UIViewController. De cette façon, vous avez accès au contrôleur de vue de niveau supérieur pour appeler le presentModalViewController et le dismissModalViewControllerAnimated.

Vous pouvez également le faire dans une sous-classe de UIViewController, puis définir la sous-classe de votre autre contrôleur de vue personnalisé. L'inconvénient de cette méthode est lorsque vous avez des sous-classes de classes autres que UIViewController

Questions connexes