2017-01-31 4 views
0

Je suis confronté à la hiérarchie des vues, mais je n'arrive pas à comprendre ce qui ne va pas ici. J'essaie d'envoyer un message (MFMessageComposeViewController). Je voudrais montrer un alertView selon le succès (ou pas) avec l'aide des méthodes de délégué. Le alertView est affiché lorsque le message est annulé, mais je reçois cette erreur lorsque le message est envoyé:Erreur lors de la présentation d'AlertView lors du rejet de MFMessageController

Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<UIAlertController: 0x153b3c00>) 

On dirait que si le bloc d'achèvement a été appelé avant la MFMessageComposeView a été rejetée completey (ou désalloué) lorsque le message est envoyé (comme s'il y avait encore quelque chose qui tourne dans les coulisses), mais pas quand il est annulé. Si elle peut aider:

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result { 

    int tag; 

    switch (result) { 
     case MessageComposeResultCancelled: 
     { 
      tag = 1; 
      NSLog(@"Cancelled"); 
      break; 
     } 
     case MessageComposeResultFailed: 
     { 
      tag = 2; 
      NSLog(@"Failed"); 
      break; 
     } 

     case MessageComposeResultSent: 
     { 
      tag = 3; 
      NSLog(@"Sent"); 
      break; 
     } 
     default: 
      break; 
    } 
    [controller dismissViewControllerAnimated:YES completion:^{ 
     [self alertSMSMessageWithTag:tag]; 
    }]; 
} 

- (void)alertSMSMessageWithTag:(int)tag { 

    UIAlertController *alertController; 

    if (tag == 1) { // cancelled 
     alertController = [UIAlertController alertControllerWithTitle:@"Message cancelled" message:nil preferredStyle:UIAlertControllerStyleAlert]; 
     UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; 
     [alertController addAction:ok]; 
    } 
    if (tag == 2) { // Failed 
     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Message failed" message:nil preferredStyle:UIAlertControllerStyleAlert]; 
     UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; 
     [alertController addAction:ok]; 
    } 
    if (tag == 3) { // sent 
     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Message sent" message:nil preferredStyle:UIAlertControllerStyleAlert]; 
     UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; 
     [alertController addAction:ok]; 
    } 
    [self presentViewController:alertController animated:YES completion:nil]; 
} 

Si quelqu'un pouvait me aider ...

Répondre

0

Vous n'êtes pas INITIALISATION UIAlertController d'une manière appropriée. Vous utilisez le même nom de variable alertController qui est public à

if (tag == 3) { 
} 

mais pas publique à la méthode. Et vous utilisez même nom variable qui est public à la méthode UIAlertController *alertController; [self presentViewController:alertController animated:YES completion:nil]; accède variable publique à la méthode c.-à-UIAlertController *alertController; que vous avez correctement initialisées pour la balise 1. Je vous suggère d'utiliser le code ci-dessous -

- (void)alertSMSMessageWithTag:(int)tag { 

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleAlert]; 
    UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; 
    [alertController addAction:ok]; 
    if (tag == 1) { // cancelled 
     alertController.title = @"Message cancelled"; 

    } 
    if (tag == 2) { // Failed 
     alertController.title = @"Message failed"; 
    } 
    if (tag == 3) { // sent 
     alertController.title = @"Message sent"; 

    } 
    [self presentViewController:alertController animated:YES completion:nil]; 
} 

Espoir son utile.