2014-01-25 268 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 
    }