2

共有ボタンのあるアプリがあります。この共有ボタンは、Facebook、Twitter、電子メール、テキスト メッセージなどで共有するために UIActivityViewController を読み込みます。

以前は問題なく動作していましたが、シミュレーターでも問題なく動作していると思いますが、デバイスではView Controllerがすべての適切なオプションとともに表示され、1つをクリックしても何も起こらないか、メールの場合はメールモーダルビューがロードされてから閉じられます。次に、「アクティビティが実行されませんでした。」というログを取得します。これは、完了ブロックが完了に対して false を返したが、activityType が null ではなかった場合です。したがって、選択を認識していますが、何らかの理由でアクティビティをビューにロードしていません

共有しようとしているものをチェックし、ダミーのものに置き換えても(以下に示すように)、まだ運がありません. 私は通常のデバイスを使用しており、Twitter、メール、および Facebook のアカウントをセットアップしており、テキスト メッセージも機能しています。機能するのはコピーだけです (つまり、共有コンテンツをクリップボードにコピーするとき)。同じデバイス上の他のアプリでは、UIActivityViewController と選択したアクティビティの読み込みは正常に機能します。アプリを実行している他のデバイスでも同じ問題が見られます。

ここで何が問題なのか本当にわかりません。非常に当惑します!試してみることの助けや提案は大歓迎です。この問題をデバッグする方法がわかりません。

コードは次のとおりです:(画像も削除しようとしたことに注意してください。運が悪い)

- (void)shareTapped {

    NSString *shareText = @"Testing";//[self shareText];

    NSURL *url = [NSURL URLWithString:@"http://www.google.ca"]; //[self shareURL];
    NSArray *activityItems = [NSArray arrayWithObjects:shareText,url, self.shareImage, nil];

    UIActivityViewController *shareDrawer = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
shareDrawer.excludedActivityTypes = @[UIActivityTypePostToWeibo,UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll,UIActivityTypePrint];

    shareDrawer.completionHandler = ^(NSString *activityType, BOOL completed) {
        if (completed) {
            NSLog(@"Selected activity was performed.");
        } else {
            if (activityType == NULL) {
                NSLog(@"User dismissed the view controller without making a selection.");
            } else {
                NSLog(@"Activity was not performed.");
            }
        }

        NSString *result = completed ? @"success" : @"fail";
        if (activityType == NULL) {
            result = @"dismissed";
        }
    };
    [self presentViewController:shareDrawer animated:YES completion:nil];
}
4

2 に答える 2

1

OK、排除のプロセスにより、最終的に犯人を絞り込みました。

テキスト用のカスタム フォントを使用したカスタム UISegmentedControl があり、適切に表示されるようにコンテンツ オフセットを手動で調整しました。これらの行を削除しましたが、セグメント化されたコントロールは実際には問題ないように見えます。

コードは次のとおりです(問題の原因は3行すべてであることを確認しました)

    [[UISegmentedControl appearance] setContentPositionAdjustment:UIOffsetMake(4, 0) forSegmentType:UISegmentedControlSegmentLeft barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setContentPositionAdjustment:UIOffsetMake(0, 0) forSegmentType:UISegmentedControlSegmentCenter barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setContentPositionAdjustment:UIOffsetMake(-4, 0) forSegmentType:UISegmentedControlSegmentRight barMetrics:UIBarMetricsDefault];

さて、共有オプションを選択した後にポップアップするビューにはセグメント化されたコントロールがありません。なぜこれがこの問題を引き起こすのかわかりません。しかし、私がそれを削除した今、それは間違いなく機能します。

助けようとしてくれた方々に感謝します。もちろん、これが問題だと推測することはできませんでした。コンテンツの位置を調整することはおそらくかなりまれであるため、最初からこの問題に遭遇する可能性は非常に低いです。

この問題をデバッグするには、次の手順に従いました。

  1. 問題が、設定していた UIActivityViewController のプロパティ、または共有していたアクティビティ アイテムと関係があるかどうかをテストしました。それはしませんでした。
  2. アプリ内の別のビュー コントローラーから呼び出されたときに、UIActivityViewController が適切に機能するかどうかをテストしました。それはしませんでした。
  3. バーボタンを押すと汎用の UIActivityViewController が表示されるようにするボタンを備えた空のビューコントローラーを作成しました。私はそれを私のルートビューにしました。それはうまくいき、それが孤立した問題であることを示しました。
  4. ビュー コントローラーをアプリのルートにする代わりに、通常のメイン ビューからプッシュしました。機能しなくなったため、問題はおそらく私のメインビューに関係していると判断しました.
  5. viewDidLoad、viewDidAppear、viewWillAppear のすべてのコードをコメント アウトしました。ただし、共有テストをロードするボタンをナビゲーション バーに追加することは除きます。それはうまくいきました。次に、viweDidAppear と viewWillAppear のコメントを外しましたが、まだ機能していました。そのため、問題が何であるかを正確に把握するまで、viewDidLoad のチャンクのコメントを外しました。

私が学んだこと: このような奇妙な問題 (つまり、iOS のバグか何かのように見えるが、それについて誰も投稿していないもの) については、スタック オーバーフローに投稿する前に、デバッグにもっと時間を費やす必要があります。(私は今ではこれを本当に知っているはずですが、デバッグするすべての新しい問題はこのルールの例外のように感じます)

これらのビューにセグメント化されたコントロールが含まれていない場合でも、UISegmentedControl のコンテンツの位置を調整すると UIActivityViewController からの共有が台無しになる理由を知っている場合は、以下にコメントしてください。

ありがとう

于 2014-02-07T23:48:13.953 に答える
0

同じ問題もありましたが、それを克服するために私がしたことは次のとおりです。

Social.framework を Link Binary に追加して使用することをお勧めします

SLComposeViewController *socialShare = [SLComposeViewController composeViewControllerForServiceType:shareType];

shareType はSLServiceTypeFacebookまたはSLServiceTypeTwitterです。

ユーザーの共有オプションを表示する UIAlertview ポップアップを作成しました

    UIAlertView *social = [[UIAlertView alloc]initWithTitle:@"Share" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Twitter", @"Facebook", @"Email", nil];

どちらを選択したか (UIAlertview Delegate メソッドを使用) に応じて、それに応じてコンテンツを共有できます。これは、UIActivityViewController の優れた代替手段です。

この提案がお役に立てば幸いです、ジム、乾杯。

于 2014-01-28T02:41:30.203 に答える