MFMailComposeViewController委托方法不会被调用

时间:2014-01-25 14:59:23

标签: ios objective-c uiview delegates mfmailcomposer

我有一种动作表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 animated:YES completion: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其中UITableViewcells其中一个UITableView应该通过添加它来触发一个subview的操作表作为cells,就像前一个一样,此视图还包含MFMailComposeViewController,其中一个将执行操作,并且它正在调用MFMailComposeController,它会被调用但不会被忽略成功即使我已设置其委托并且所有方法都正确,问题的原因是调用UITableView的方式,我首先从超级视图中移除了小MFMailComposeController然后呈现{{ 1}},所以当我解雇邮件编写器时,它甚至没有给出结果就崩溃了,这让我把崩溃的原因和委托方法混为一谈,愚弄我。 这是代码:

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

4 个答案:

答案 0 :(得分:3)

您确定没有调用委托方法吗?我做了一个测试,它被调用,但要解雇邮件编写者使用这样的代码:

[feedBackComposer dismissViewControllerAnimated: YES completion: nil];

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

答案 1 :(得分:2)

要添加一些东西给Vitaly S.的答案(由于缺乏声誉,我不能直接评论它,抱歉) - 调用委托方法,所以问题就是解雇。你可以试试这个:

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

答案 2 :(得分:1)

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

调用UIView的视图控制器将拥有您的代理

<UITableViewDelegate, UITableViewDataSource, MFMailComposeViewControllerDelegate, UINavigationControllerDelegate>

在它的头文件中。

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

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

Trigger a method in UIViewController from its View

希望这有帮助,吉姆

答案 3 :(得分:0)

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

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