1

MFMailComposeViewControllerカスタム クラス (viewController ではない) から提示しています。iOS5 では正常に動作していますが、iOS6 では構成シートを表示した直後にクラッシュします。ビューを表示した後に dealloc メソッドが呼び出されるという問題を発見したため、 self は deallocatingです。このため、mailcomposer は自分自身でデリゲート メソッドを呼び出すことができないため、クラッシュしています。私はそれに対する解決策を得ませんでした。ARCを使用しています。デリゲート メソッドが呼び出されるまで割り当てを解除しないようにするにはどうすればよいですか?self

  -(void)shareOnViewController:(UIViewController *)viewController  completion:(ShareCompletionHandler)completion
{

  if ([MFMailComposeViewController canSendMail]) {

    MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
    mailer.mailComposeDelegate = self;
    mailer.modalPresentationStyle = UIModalPresentationPageSheet;
    [mailer setSubject:[self.userInfo objectForKey:@"title"]];

    NSData *imageData = UIImagePNGRepresentation([self.userInfo objectForKey:@"image"]);
    if (imageData) {
        [mailer addAttachmentData:imageData mimeType:@"image/png" fileName:@"AttachedImage"];
    }


    NSURL *emailBody = [self.userInfo objectForKey:@"url"];
    if (![emailBody isEqual:@""]) {
        [mailer setMessageBody:[emailBody absoluteString] isHTML:NO];
    }

    [viewController presentModalViewController:mailer animated:YES];

   } else {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Unable to send mail"
                                                    message:@"Device is not configured to send mail"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
   }

self.completionHandler = completion;

}
4

3 に答える 3

1

私によると、このpresentModalViewControllerメソッドは iOS 6.0 で廃止されました。

代わりに使用する必要があります

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion 

そうでなければ、クラッシュログを表示できますか??

于 2013-06-12T05:00:28.370 に答える
0

考えられる根本原因の 1 つは ARC です。

 MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];

メソッド本体が完全に実行されるとすぐに、 メーラーは自動解放されます。

オブジェクトを保持する参照を作成して、準備が整う前に ARC がオブジェクトを解放しないようにすることができます。

@property (nonatomic, strong) MFMailComposeViewController * composer;
....


self.composer = [[MFMailComposeViewController alloc] init];
...
[viewController presentViewController:self.composer animated:YES];

[編集された提案]

申し訳ありませんが、別のカスタム クラスからメソッドを呼び出していた質問の最初の部分を見逃しています。

私も同様の状況に遭遇しました。最後に、「カスタム クラス」をシングルトン クラスに変換しました。

#pragma mark Singleton Methods

+ (id)sharedInstance {
    static CustomClass *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

これにより、クラスが適切に保持されるようになります。ただし、これは CustomClass の使用法と設計に依存します。私がしたことを共有するだけです。

[[CustomClass sharedInstance] shareOnViewController:vc completion:...];
于 2014-07-08T11:51:45.813 に答える