2017-01-31 4 views
0

Я борюсь с иерархией представлений, но не могу понять, что здесь происходит. Я пытаюсь отправить сообщение (MFMessageComposeViewController). Я хотел бы показать alertView в зависимости от успеха (или нет) с помощью методов делегата. AlertView отображается, когда сообщение будет отменено, но я получаю эту ошибку, когда посылается сообщение:Ошибка при представлении AlertView при отклонении 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>) 

Это выглядит так, как будто блок завершения назывались до MFMessageComposeView был completey уволен (или перераспределены), когда сообщение (как будто все еще что-то работает за кулисами), но не тогда, когда оно отменено. Если это может помочь:

- (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]; 
} 

Если кто-то может мне помочь ...

ответ

0

Вы не инициализация UIAlertController надлежащим образом. Вы используете одноименное имя alertController, которое является общедоступным для

if (tag == 3) { 
} 

но не публично для метода. И вы используете тот же имя переменной, которая является общественным методу UIAlertController *alertController; [self presentViewController:alertController animated:YES completion:nil]; обращаются к общественности переменной метода т.е. UIAlertController *alertController; который вы правильно инициированную для тега 1. Я хотел бы предложить вам использовать следующий код -

- (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]; 
} 

надеюсь, что его полезно.

Смежные вопросы