2

ボタンがいくつかのコンテンツを共有するために UIActivityViewController を表示する非常に単純なケースがあります。問題は、ユーザーがメールをキャンセルまたは送信したときに、メール コンポーザーが閉じられないことです。

NSArray *items = [NSArray arrayWithObjects:@"share",nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];

activityViewController.completionHandlerでモーダル ビューを閉じようとしましたが、別のアニメーションが進行中で、アプリがクラッシュすることがあるとコンソールに表示されるため、これは解決策ではありません。また、他のソーシャル ネットワーク (Facebook、Twitter) は何もしなくてもうまく機能します。

いくつかのテストの後、これは、UIActivityViewController を提示する UIViewController が UITabBarController の子である場合にのみ発生することがわかりました。AppDelegate で次のようにアプリを作成すると、機能しません。

UIViewController > UINavigationController > UITabbarController > Window

しかし、タブバーを削除すると、すべて正常に動作します!:

UIViewController > UINavigationController > Window 

この問題を解決する回避策は、rootviewcontroller から提示されます。

[self.view.window.rootViewController presentViewController:activityViewController animated:YES completion:NULL];

しかし、ここで何が起こっているのか知りたいです。

ありがとう!;)

4

1 に答える 1

0

私は同じ問題を抱えていましたが、ウィンドウで現在アクティブなクラスからメールコンポーザーを提示しないと、すべての呼び出しで存在しないように、しばらくの間応答が得られないことがわかりました。 、解雇の問題も同じです。 UITabbarController の場合だけというわけではありません。現在ウィンドウ上にない別のコントローラーから提示している場合、どのアーキテクチャーでも発生する可能性があります。それがあなたの回避策が機能している理由であり、それは間違っていません。

uipopover 内でタップされたボタンからメール コンポーザを提示していました。メール コンポーザーは、そのポップオーバー コントローラー クラスで提示されていました。そして、私はあなたが直面しているのと同じ問題に直面していました。次に、コードを次のように変更しました。

MFMailComposeViewController *mailComposer = [MFMailComposeViewController new];

    [mailComposer addAttachmentData:data mimeType:@"application/pdf" fileName:model.documentTitle];

    [mailComposer setSubject:model.documentTitle]; // Use the document file name for the subject

    if(kBccEmailID)
        [mailComposer setBccRecipients:[[NSArray alloc]initWithObjects:kBccEmailID, nil ]];

    mailComposer.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

    mailComposer.modalPresentationStyle = UIModalPresentationFormSheet;

    AppDelegate *delagate =(AppDelegate *) [[UIApplication sharedApplication]delegate];

    mailComposer.mailComposeDelegate = [[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject]; // Set the delegate


    [(UIViewController *)[[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject] presentViewController:mailComposer animated:YES completion:nil];

[(UIViewController *)[[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject] は、「self.view.window.rootViewController」の代替です。

于 2013-11-05T08:35:24.633 に答える