【问题标题】:MFMessageComposeViewController cancel button not workingMFMessageComposeViewController 取消按钮不起作用
【发布时间】:2015-06-25 07:43:40
【问题描述】:

我使用这个块向联系人发送消息,发送后,返回按钮在那里,但是当我触摸它时没有任何反应。请帮帮我:)

-(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:

标签: ios objective-c mfmailcomposeviewcontroller


【解决方案1】:

你忘了实现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(@"消息发送");否则 NSLog(@"消息失败"); }
  • 好的,你可以根据需要组织你的逻辑 :) 嗯,这是我项目中的 sn-p - 并且推荐苹果 developer.apple.com/library/prerelease/ios/documentation/…
【解决方案2】:

这是 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)
    }

【讨论】:

    【解决方案3】:

    正确答案是设置控制器的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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        这是 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;
                }
        

        【讨论】:

          【解决方案6】:

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

          确保您设置了正确的委托 :)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-02-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-14
            • 2014-07-20
            • 1970-01-01
            相关资源
            最近更新 更多