18

次のようなソーシャル共有コードがあります。

SLComposeViewController *composer = [SLComposeViewController composeViewControllerForServiceType:…];
[composer setInitialText:…];
[composer addURL:…];
[composer setCompletionHandler:^(SLComposeViewControllerResult result) {
    [someController dismissViewControllerAnimated:YES completion:^{
        … // 1
    }];
}];
[someController presentModalViewController:composer animated:YES];

問題は、Facebook と Twitter でコードの動作が異なることです。dismissViewControllerAnimated:ユーザーが Facebook の作成画面を確認すると、1 としてマークされた完了ハンドラーが呼び出されず、呼び出しを削除してもすべて正常に動作するため、コンポーザーは明らかにそれ自体を閉じます。

一方、ユーザーが Twitter の作成画面を確認し、手で閉じないと、作成画面はスライドアウトしますが、一部のコントローラーがまだフォアグラウンドにあるように、アプリはスタックしたままです。呼び出しを追加するdismissViewControllerAnimated:と、問題がなくなり、完了ハンドラー (1) が正しく呼び出されます。

あなたもこの行動に気づきましたか?私は何か間違ったことをしていますか?これは現在の iOS 6、GitHub のサンプル コードです。私はこの問題を Apple (Radar #12642889) に報告しましたが、まだ反応はありません。

4

3 に答える 3

2

私は自分のアプリで同様のことをしていますが、コードとの唯一の違いは、ViewControllerに送信dismissModalViewControllerAnimated:するselfのではなくに送信することです。
フェイスブックとツイッターの両方の作曲家が滑り落ちます。

これは私のコードです:

SLComposeViewController *composer = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[composer setInitialText:text];
[composer setCompletionHandler:^(SLComposeViewControllerResult result) {
    ...
    [self dismissModalViewControllerAnimated:YES];
}];
[self presentModalViewController:composer animated:YES];
于 2012-12-26T23:17:29.753 に答える
1

動作に関する問題を確認しました:

Twitter バージョンは、ビュー コントローラーで設定した完了ハンドラーを呼び出し、このハンドラー内から DismissViewController を呼び出すことを想定しています。

ただし、Facebook バージョンは、完了ハンドラーを呼び出す前に、dismissViewController 自体を呼び出します。その後、dismissViewController を自分で呼び出しても何も起こらず、dismissViewController に渡す可能性のある完了ブロックからのコールバックは取得されません。

DismissViewController の呼び出しを省略した場合、Twitter の共有は停止しますが、Facebook は機能します。

解決策が壊れてしまうため、Apple が動作を修正しようとしている場合、解決策を作成するのは問題です。主な問題は、同じソーシャル共有 VC の Weibo、Twitter、および Facebook 共有バージョン間で動作が同じではないことです。

問題を修正した方法は次のとおりです。

SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:serviceType];
if(vc==nil)
{
    [self.delegate imageSaveDidSucceed:NO];
}
else
{
    [vc addImage:self.image];
    vc.completionHandler = ^(SLComposeViewControllerResult result) {
        DEBUG_LOG(@"social sharing completed");
        if(self.presentedViewController)
        {
            DEBUG_LOG(@"presented vc is not nil");
            [self dismissViewControllerAnimated:YES completion:^{
                DEBUG_LOG(@"dismissed vc and calling imageSaveDidSucceed");
                [self.delegate imageSaveDidSucceed:YES];
            }];
        }
        else
        {
            DEBUG_LOG(@"presented vc is nil");
            [self.delegate imageSaveDidSucceed:YES];
        }
    };
    [self presentViewController:vc animated:YES completion: ^{DEBUG_LOG(@"vc was presented");}];
}
于 2013-07-01T19:44:32.827 に答える