2014-01-25 222 views
2

我有一种操作工作表UIView它调用MFMailComposeViewController后点击一个按钮,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:@"[email protected]"]]; 
    [feedBackComposer setMessageBody:@"" isHTML:NO]; 
    [feedBackComposer setSubject:@"What I Love About iBox"]; 
} 

,并呼吁作曲家: - (无效)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,其中包括该视图中的cellsUITableView应该可以将其作为一个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:@"[email protected]"]]; 
    [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); 
} 

感谢斯特凡·阿塔纳索夫,吉姆和维塔利·S.

+0

'sendFeedbackComposer'方法是从其他类调用? – Robert

+0

不,来自同一班,它是一个UIView。 –

+0

其他实施的委托从这个类是否正常工作? – Robert

回答

1

要添加的东西维塔利S.的答案(由于缺乏声誉我不能直接对此发表评论,对不起) - 委托方法被调用,所以问题在于解雇。你可以试试这个:

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

但问题不是解雇,而是方法本身;它不会被调用,不确定是因为它是一个“Subclass UIView”还是什么,但奇怪的是像UITableViewDelegate这样的其他委托方法被调用和轻松使用。 –

+0

嗯,奇怪 - 我用你的代码做了一个简单的测试项目 - 委托方法是第一次调用,作曲家没有被解雇,之后它再也没有被调用(但仍然被调用一次)。 –

+0

奇怪,但这个方法怎么被调用,但作曲家没有被解雇?对我而言,它永远不会被调用,并且有时当我点按“取消”和其他时间崩溃时,它什么也不做。 –

1

的委托方法需要从所谓的viewController,而不是从UIView的范围内。

调用的UIView你的视图控制器将有您的代表

<UITableViewDelegate, UITableViewDataSource, MFMailComposeViewControllerDelegate, UINavigationControllerDelegate> 

在它的头文件。

您需要制作委托方法将信息从UIView传递到控制器,控制器将依次调用邮件和表委托方法。

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

Trigger a method in UIViewController from its View

希望这有助于吉姆

+0

哦,我也猜到了!但是如何成功调用和使用'UITableViewDelegate,UITableViewDataSource>?另外,这个'UIView'是一个'subclass',而不是'UIViewController'的UIView',我仍然可以触发'UIViewController'中的方法吗?并感谢您的回答。 –

2

你确定委托方法不叫?我做了一个试验,这就是所谓的,但驳回邮件撰写使用这种代码:

[feedBackComposer dismissViewControllerAnimated: YES completion: nil];

而且它真的很奇怪,实现视图实现的代表,而不是在视图控制器

+0

是的,它在'UIViewController'中工作,但它不在'UIView'中,我不知道为什么,我使用了你的代码,它给出了相同的结果。我将解释我想实现的目标:我有一个'UIViewController',它包含一个按钮,将UIView'作为子视图添加,就像一个操作表,然后'UIView'中的一个按钮应该调用'MFMailComposeViewController',这就是为什么我试图从'UIView'而不是'UIViewController'来做到这一点,任何其他的建议都是值得赞赏的。 –

0

你需要检查是设备配置通过检查MFMailComposeViewController发送邮件是无济于事回应与否。

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