MFMessageComposeViewController取消按钮无法正常工作

18

我使用这个块向联系人发送消息,发送后出现了返回按钮,但是当我点击它时,没有任何反应。请帮帮我 :)

-(IBAction) InviteIt:(id) sender{


    if ([MFMessageComposeViewController canSendText]) {
        MFMessageComposeViewController *messageComposer =
        [[MFMessageComposeViewController alloc] init];
        messageComposer.messageComposeDelegate = self;
        NSString *message = @"You have more body buddies than you think at: http://www.itunes.com/app/JoyChain ";
        [messageComposer setBody:message];
        messageComposer.recipients = [NSArray arrayWithObjects:_itsnum, nil];
        messageComposer.messageComposeDelegate = self;
        [self presentViewController:messageComposer animated:YES completion:nil];

    }

}

命名规范注释:方法名应该以小写字母开头,例如 –inviteIt: - holex
6个回答

24

您是否忘记实现mailComposeController:didFinishWithResult:?...

- (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    switch (result)
    {
        case MFMailComposeResultCancelled:
            NSLog(@"Mail cancelled");
            break;
        case MFMailComposeResultSaved:
            NSLog(@"Mail saved");
            break;
        case MFMailComposeResultSent:
            NSLog(@"Mail sent");
            break;
        case MFMailComposeResultFailed:
            NSLog(@"Mail sent failure: %@", [error localizedDescription]);
            break;
        default:
            break;
    }

    // Close the Mail Interface
    [controller dismissViewControllerAnimated:YES completion:nil];
}

来自苹果文档:

// The mail compose view controller delegate method
- (void)mailComposeController:(MFMailComposeViewController *)controller
              didFinishWithResult:(MFMailComposeResult)result
              error:(NSError *)error
{
    [self dismissModalViewControllerAnimated:YES];
}

但是你可以根据你的目标处理所有情况...


哈哈,太好了!虽然应该像这样:code- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result { [self dismissModalViewControllerAnimated:YES];if (result == MessageComposeResultCancelled) NSLog(@"消息已取消"); else if (result == MessageComposeResultSent) NSLog(@"消息已发送"); else NSLog(@"消息发送失败");} - user4034591
好的,你可以自由组织你的逻辑 :) 嗯,这是我项目中的工作代码片段 - 并且正如 Apple 建议的一样 https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/SystemMessaging_TopicsForIOS/Articles/SendingaMailMessage.html - Doro

8

以下是针对Swift 4,iOS 11的答案:

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        print("Emailing attempt, error="+(error?.localizedDescription)!)        
        switch (result){
        case MFMailComposeResult.cancelled:
            print("Mail cancelled");
            break;
        case MFMailComposeResult.saved:
            print("Mail saved");
            break;
        case MFMailComposeResult.sent:
            print("Mail sent");
            break;
        case MFMailComposeResult.failed:
            print("Mail sent failure: %@", error?.localizedDescription);
            break;
        default:
            break;
        }
        // Close the Mail Interface
        controller.dismiss(animated: true)
    }

5

如果有需要的话,将messageComposeDelegate方法翻译成Swift(3):

func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
    controller.dismiss(animated: true)
}

4
正确的答案是设置控制器的messageComposeDelegate,并定义以下代理方法:
- (void)messageComposeViewController:(MFMessageComposeViewCont‌​roller *)controller
                 didFinishWithResult:(MessageComposeResult)result {

  [self dismissModalViewControllerAnimated:YES];
  if (result == MessageComposeResultCancelled)
    NSLog(@"Message cancelled");
  else if (result == MessageComposeResultSent)
    NSLog(@"Message sent");
  else
    NSLog(@"Message failed");
}

@Doro的回答是基于MFMailComposeViewController而不是MFMessageComposeViewController

2

就像其他答案所说,您需要在委托中解除。我的问题是我设置了delegate而不是messageComposeDelegate(或电子邮件版本的mailComposeDelegate)。

请确保您正在设置正确的委托:)


0

这是 Swift 4,iOS 11 的答案。

case MFMailComposeResult.cancelled:
            print("Mail cancelled");
            break;
        case MFMailComposeResult.saved:
            print("Mail saved");
            break;
        case MFMailComposeResult.sent:
            print("Mail sent");
            break;
        case MFMailComposeResult.failed:
            print("Mail sent failure: %@", error?.localizedDescription);
            break;
        default:
            break;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接