【问题标题】:MFMailComposeViewController Delegate Method Doesn't Get Called未调用 MFMailComposeViewController 委托方法
【发布时间】:2014-01-25 14:59:23
【问题描述】:

我有某种操作表 UIView,它在点击其中的按钮后调用 MFMailComposeViewController,MFMailComposeViewController 被成功调用并呈现,但是当我点击取消时它不会关闭,有时会崩溃,我知道这是已知问题,但我已经尝试了所有已知的修复方法,但它对我不起作用。这是我的代码:

SendFeedback.h:

#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>

@interface SendFeedback : UIView <UITableViewDelegate, UITableViewDataSource, MFMailComposeViewControllerDelegate, UINavigationControllerDelegate>

//Useless code to the problem.    

@property (nonatomic, retain) MFMailComposeViewController *feedBackComposer;

@end

SendFeedback.m:

- (void)baseInit
{
    //Useless code to the problem. 

    feedBackComposer = [[MFMailComposeViewController alloc] init];
    [feedBackComposer setMailComposeDelegate:self];
    [feedBackComposer setToRecipients:[NSArray arrayWithObject:@"info@getibox.com"]];
    [feedBackComposer setMessageBody:@"" isHTML:NO];
    [feedBackComposer setSubject:@"What I Love About iBox"];
}

然后调用作曲家: - (void)sendFeedbackComposer { [self.window.rootViewController presentViewController:feedBackComposer 动画:YES 完成:nil]; }

解除它:

- (void)mailComposeController:(MFMailComposeViewController *)feedBackComposer didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    //This method doesn't get called.

    [self.window.rootViewController dismissViewControllerAnimated:YES completion:nil];

    NSLog(@"Error: %@", error);
}

编辑:所以,这个问题中提供的所有答案都是正确的,这都是我的错。我想做的是:我有一个UINavigationController,其中包括一个UITableView,其中一个cells应该通过将其添加为subview来触发一个UITableView的操作表,就像前一个,此视图还包括cells,其中一个将执行操作,它正在调用MFMailComposeViewController,即使我设置了它的委托并且所有方法都正确,它也会被调用但不会成功关闭,问题的原因是调用MFMailComposeController的方式,我首先从超级视图中删除了那个小UITableView然后呈现MFMailComposeController,所以当我关闭邮件编写器时它崩溃了,甚至没有给出结果,这让我将崩溃的原因与委托方法混淆,愚弄我。 代码如下:

- (void)removeView
{
    if (self) {
        [UIView animateWithDuration:0.3
                         animations:^{backgroundView.alpha = 0;}
                         completion:^(BOOL finished){

        [UIView animateWithDuration:.3
                         animations:^{self.frame = CGRectMake(0, 568, 320, 568);}
                         completion:^(BOOL finished){[self removeFromSuperview];}];
        }];
    }
}
- (void)sendFeedbackComposer
{
    feedBackComposer = [[MFMailComposeViewController alloc] init];
    [feedBackComposer setMailComposeDelegate:self];
    [feedBackComposer setToRecipients:[NSArray arrayWithObject:@"info@getibox.com"]];
    [feedBackComposer setMessageBody:@"" isHTML:NO];
    [feedBackComposer setSubject:@"What I Love About iBox"];

    [self.window.rootViewController presentViewController:self.feedBackComposer animated:YES completion:nil];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.row) {
        case 2: //That's the index of the MailComposer caller.
            [self removeView];
            [self sendFeedbackComposer];
            break;
        case 6:
            [self removeView];
            break;
        default:
            break;
    }
}
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    [feedBackComposer.presentingViewController dismissViewControllerAnimated:YES completion:nil];

    NSLog(@"Error: %@", error);
}

感谢 Stefan Atanasov、Jim 和 Vitaly S。

【问题讨论】:

  • 那个sendFeedbackComposer 方法是从其他类调用的?
  • 不,来自同一个类,它是一个 UIView。
  • 这个类的其他实现的委托是否工作正常?
  • 是的,一个是UITableViewDelegate,它很容易工作。

标签: ios objective-c uiview delegates mfmailcomposer


【解决方案1】:

您确定没有调用委托方法吗?我做了一个测试,它被调用了,但是要关闭邮件作曲家,请使用这样的代码:

[feedBackComposer dismissViewControllerAnimated: YES completion: nil];

在视图实现中实现委托也很奇怪,而不是在视图控制器中

【讨论】:

  • 是的,它在UIViewController 中有效,但在UIView 中无效,我不知道为什么,我使用了您的代码,它给出了相同的结果。我将解释我要实现的目标:我有一个UIViewController,其中包含一个按钮,将UIView 添加为子视图,它就像一个操作表,然后UIView 中的一个按钮应该调用MFMailComposeViewController,这就是为什么我试图从 UIView 而不是 UIViewController 来做这件事,任何其他的建议都值得赞赏。
【解决方案2】:

要在 Vitaly S. 的回答中添加一些内容(由于缺乏声誉,我无法直接对其发表评论,抱歉) - 调用了委托方法,所以问题是解雇。你可以试试这个:

[feedBackComposer.presentingViewController dismissViewControllerAnimated: YES completion: nil];

【讨论】:

  • 但问题不在于解雇,而在于方法本身;它没有被调用,不确定是因为它是 Subclass UIView 还是什么,但奇怪的是,像 UITableViewDelegate 这样的其他委托方法很容易被调用和使用。
  • 嗯,奇怪 - 我用你的代码做了一个简单的测试项目 - 委托方法第一次被调用,作曲家没有被解雇,之后它就再也没有被调用过(但它仍然被调用一次) .
  • 奇怪,但是为什么方法被调用但作曲家没有被解雇?对我来说,它永远不会被调用,有时当我点击取消时它什么也不做,有时它会崩溃。
  • 老实说我不知道​​ - 这是测试项目,基本上是你的代码,所以可能其他地方有问题github.com/StefanAtanasov/MailComposerTest
  • 您的代码有效!我没有做错什么,我现在会调查并通知你。
【解决方案3】:

委托方法需要从 viewController 中调用,而不是从 UIView 中调用。

您调用 UIView 的视图控制器将拥有您的委托

<UITableViewDelegate, UITableViewDataSource, MFMailComposeViewControllerDelegate, UINavigationControllerDelegate>

在它的头文件中。

您需要创建一个委托方法将信息从 UIView 传递到控制器,然后控制器将调用邮件和表格委托方法。

这是一个问题的链接,该链接演示了如何使用委托协议从 UIView 触发视图控制器中的方法。

Trigger a method in UIViewController from its View

希望这会有所帮助,吉姆

【讨论】:

  • 哦,我也猜到了!但是&lt;UITableViewDelegate, UITableViewDataSource&gt; 怎么会被成功调用和使用呢?另外,这个UIViewsubclass,不是UIViewControllerUIView,还能触发UIViewController中的方法吗?并感谢您的回答。
【解决方案4】:

您需要通过检查 MFMailComposeViewController 是否可以响应来检查设备是否配置为发送邮件。

  if([MFMailComposeViewController canSendMail]){
  //your code
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多