MFMessageComposeVIewController正在解雇其委托而不是自己

时间:2016-11-02 20:44:39

标签: ios objective-c uinavigationcontroller mfmessagecomposeview

我有一个符合MFMessageComposeViewControllerDelegate协议的VC。

我使用以下代码成功呈现此视图控制器:

- (IBAction)textAction:(id)sender {
    if(![MFMessageComposeViewController canSendText])
    {
        UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Your device doesn't support SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [warningAlert show];
        return;
    }

    NSString *numberToCallOrText = self.phoneNumber;
    NSString *message = @"Test message";
    NSArray *recipients = [NSArray arrayWithObject:numberToCallOrText];
    MFMessageComposeViewController *messageController = [[MFMessageComposeViewController alloc] init];
    messageController.messageComposeDelegate = self;
    [messageController setRecipients:recipients];
    [messageController setBody:message];

    // Present message view controller on screen
    [self.view endEditing:YES];
    [self presentViewController:messageController animated:YES completion:nil];
}

此外,我正在处理完成结果:

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult) result
{
    switch (result) {
        case MessageComposeResultCancelled:
            NSLog(@"Canceled");
            break;

        case MessageComposeResultFailed:
        {
            NSLog(@"Failed");
            UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Failed to send SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [warningAlert show];
            break;
        }

        case MessageComposeResultSent:
            NSLog(@"sent");
            [self.navigationController popViewControllerAnimated:YES];
            break;

        default:
            break;
    }
    [controller.view endEditing:YES];
    [self.navigationController popViewControllerAnimated:YES];
//    [self dismissViewControllerAnimated:YES completion:nil];
//    [controller popToViewController:self animated:YES];
//    [controller dismissViewControllerAnimated:YES completion:nil];
}

三条注释掉的线是我尝试过的替代方案。发生的事情是MFMessageComposeViewController保留在屏幕上(虽然键盘被解除),但是委托正从堆栈中弹出。因此,当我再次点击取消时,我得到一个空引用错误。

这很奇怪,因为我的代码中的其他地方也可以使用相同的实现。唯一的区别是我将身体设置为初始化。

为什么错误的VC会在这里出现?

感谢。

编辑 - 破坏的实现是在UITableViewController上而不是UIView控制器......这可能是导致问题的原因吗?

3 个答案:

答案 0 :(得分:0)

您正在使用presentViewController:animated:completion:展示消息编辑器。当以这种方式呈现视图控制器时,必须使用dismissViewControllerAnimated:completion:解除它。

但是你正在使用popViewControllerAnimated:告诉导航控制器解除导航堆栈顶部的任何视图控制器。这不是消息编写器,而是呈现它的视图控制器。

你接近其中一条已注释掉的线条。您需要替换:

[self.navigationController popViewControllerAnimated:YES];

使用:

[controller dismissViewControllerAnimated:YES completion:nil];

您还需要删除该行:

[self.navigationController popViewControllerAnimated:YES];

发送邮件时。不要做任何额外的解雇。

答案 1 :(得分:0)

请看下面的代码希望它对你有用....

-(void) showEmailModalView    
{
   if ([MFMailComposeViewController canSendMail])
    {
        MFMailComposeViewController* controller
        = [[MFMailComposeViewController alloc] init];
        controller.mailComposeDelegate = self;
        [controller setToRecipients: @[@"dept-em@np.edu.sg"]];

        [self presentViewController: controller
                           animated: YES
                         completion: nil];
    }
    else
    {
        UIAlertController* alert = [UIAlertController
           alertControllerWithTitle: @"Email not configured"
           message: @"Please add/enable an email "
           @"account in the phone to send email"
           preferredStyle: UIAlertControllerStyleAlert];

        UIAlertAction* ok = [UIAlertAction
           actionWithTitle: @"Ok"
           style: UIAlertActionStyleDefault
           handler: nil];

        [alert addAction: ok];

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


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

{ 

    switch (result)        
    {

      case MFMailComposeResultCancelled:
        break;
      case MFMailComposeResultSaved:
        break;
      case MFMailComposeResultSent:
        break;
      case MFMailComposeResultFailed:
        break;

      default:
      {

        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Email" message:@"Sending Failed - Unknown Error :-(" preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
        [alertController addAction:ok];
        [self presentViewController:alertController animated:YES completion:nil];


       }            
       break;
     }

     [self dismissViewControllerAnimated:controller completion:nil];
}

答案 2 :(得分:0)

问题似乎源于从UITableViewController而不是UIViewController调用MFMessageComposeViewController。因此,我的解决方案是让表推送另一个视图控制器,其唯一目的是推送MFMessageComposeViewController,并在MFMessageComposeViewController的完成处理程序中解除它自己。

相关问题