2012-03-29 13 views
5

に私はいくつかのiPhoneのプロジェクトで使用できる「ユーティリティ電子メールの送信者クラス」を作成しようとしています。MFMailComposeViewControllerは別のクラス

私はその目的のためにMailSenderのヘッダーと実装を作成しました。

MailSender.h:

@interface MailSender : NSObject<MFMailComposeViewControllerDelegate> 

- (id) initWithParent:(UIViewController*) mainController; 

- (void) invokeMailSender:(NSString*) to:(NSString*) subject:(NSString*) failureTitle:(NSString*) failureMessage:(NSString*) failureCancel; 

@end 

MailSender.m:

:私は、次の手順を使用して(ボタンにアクションをタッチダウン)ビューコントローラからクラスを呼ば
#import "MailSender.h" 

@implementation MailSender 

MFMailComposeViewController* mailer; 
UIViewController* mailParentController; 

- (id) initWithParent:(UIViewController*) mainController 
{ 
    if(self = [super init]) 
    { 
     mailParentController = mainController; 
    } 
    return self; 
} 

- (void) invokeMailSender:(NSString*) to:(NSString*) subject:(NSString*) failureTitle:(NSString*) failureMessage:(NSString*) failureCancel; 

{ 
    if([MFMailComposeViewController canSendMail]) 
    { 
     mailer = [[MFMailComposeViewController alloc] init]; 

     mailer.mailComposeDelegate = self; 

     [mailer setSubject:subject]; 

     NSArray *toRecipients = [NSArray arrayWithObjects:to, nil]; 

     [mailer setToRecipients:toRecipients]; 
     [mailParentController presentModalViewController:mailer animated:YES]; 
    } 
    else 
    { 
     UIAlertView* alert = [[UIAlertView alloc] initWithTitle:failureTitle message:failureMessage 
                 delegate:nil cancelButtonTitle:failureCancel otherButtonTitles: nil]; 

     [alert show]; 
    } 
} 

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error 
{ 
    // Do nothing 
    [mailParentController dismissModalViewControllerAnimated:YES]; 
    mailer = nil; 
} 



@end 

@implementation InfoViewController 

MailSender *sender; 

- (IBAction)openMail:(id)sender 
{ 
    sender = [[MailSender alloc] initWithParent:self]; 
    [sender invokeMailSender:@"[email protected]" :@"123" :@"123" :@"123" :@"123"]; 
} 

.... 
@end 

私は、コードを実行すると、私は正しくメールビューを表示することができています。ただし、これに続いてクラッシュが発生します。 私のUIViewControllerからMFMailComposeViewControllerを直接使用するとクラッシュしないことに注意してください(デリゲートとしてView Controllerを割り当てます)

アイデアはありますか? は申し訳ありませんが、私はまだObjective Cのに新しいです:)

+1

このコードでは問題はありません...うまく動作するはずです。クリーンビルドを試みるか、xcodeを再起動してください。私はそれがどこか他の場所からクラッシュしていると思う。 –

+0

削除した場合:mailer.mailComposeDelegate = self;それはもうクラッシュしない!私の代議員に何か間違っていますか? – SiN

+0

何時にクラッシュしますか? 'didFinishWithResult'デリゲートメソッドが何時でも呼び出されますか?また 'initWithParent'メソッドを呼び出すView Controllerのコードを投稿することもできますか? – Mutix

答えて

7

あなたの送信者MailSenderのインスタンスを保持する必要があります。呼び出しメッセージを呼び出した後で解放されています。

あなたはsenderという名前propertyを宣言することでこれを行うことができます。例えば。ところで

@property (strong, nonatomic) MailSender *sender; 
... 
@synthesize sender = _sender; 
... 
self.sender = [[MailSender alloc] initWithParent:self]; 
[self.sender invokeMailSender:@"[email protected]" :@"123" :@"123" :@"123" :@"123"]; 

、あなたのメソッドの宣言が少しおかしいです。引数には名前を付ける必要があります。例えば。

- (void)invokeMailSender:(NSString *)sender 
         to:(NSString *)to 
       subject:(NSString *)subject 
      failureTitle:(NSString *)failureTitle 
      failureMessage:(NSString *)failureMessage 
failureCancelButtonTitle:(NSString *)failureCancelButtonTitle 
+0

ありがとう、その仕事。メソッド宣言のヒントもありがとうございます。あなたが私に答えることができるかどうかわからない2つの質問があります:1私はそれを無効化していないことを知っているので、ARCは送信者インスタンスをどのように解放していたのですか? 2 - あなたが提供したソリューションでは、すべてのクラス(ヘッダーにあるため)からプロパティ*送信者にアクセスできるようになりました。私の側からの誤解をおかけして申し訳ありません。 – SiN

+1

呼び出しメッセージを呼び出した後にもう使用しなかったため、リリースされました。カテゴリを使用してプロパティを非公開にすることができます。このリンクを参照してくださいhttp://stackoverflow.com/questions/172598/best-way-to-define-private-methods-for-a-class-in-objective-c –

+0

ありがとうポール – SiN

関連する問題