以前に同じ問題について質問したことがあり、解決策は機能しましたが、互換性のある iOS 4.3 ソリューションではなく、私の設計は適切ではないと思いました。
ボタンを押したときに、MFMailComposeView(Controller) を RootView(Controller) の上にモーダル ビューとして表示したいと考えています。そして、デリゲートにする代わりに、プロトコルを実装する単純な NSObject を作成したいと考えています。RootViewController で MFMailComposeView(Controller) を表示できるのは誰ですか。
この設計/解決策を試しているところ、メモリ割り当て/アクセスの問題が発生します。
RootViewController.m:
- (IBAction)tapExportButton:(id)sender
{
SendMailController *sendMailController = [[SendMailController alloc]initWithParentViewController:self];
[sendMailController openMailDialog];
[sendMailController release];
}
SendMailController.h
@interface SendMailController : NSObject <MFMailComposeViewControllerDelegate>
- (id)initWithParentViewController:(UIViewController *)parentViewController;
- (void)openMailDialog;
@property (retain, nonatomic) UIViewController* parentViewController;
@end
SendMailController.m
#import "SendMailViewController.h"
@implementation SendMailController
@synthesize parentViewController = _parentViewController;
- (id)initWithParentViewController:(UIViewController *)parentViewController
{
if (self=[super init]) {
self.parentViewController = parentViewController;
}
return self;
}
- (void) dealloc
{
self.parentViewController = nil;
[super dealloc];
}
- (void)openMailDialog
{
if ([MFMailComposeViewController canSendMail])
{
MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
mailer.mailComposeDelegate = self;
...
mailer.modalPresentationStyle = UIModalPresentationPageSheet;
[self.parentViewController presentModalViewController:mailer animated:YES];
[mailer release];
}
}
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
switch (result)
...
// Remove the mail view
[controller.parentViewController dismissModalViewControllerAnimated:YES];
}
@end
委任メソッドにブレークポイントを設定すると、その前に既にクラッシュします。メーラー(MFMailComposeViewController)のdelegateプロパティとは何か?