13

iOS 6 で顧客の UIActivity サブクラスを使用する場合、最初の UIActionViewController のビューからアクションが選択されたときに表示されるカスタム ビュー コントローラーを指定できます。これを行うには、UIActivity サブクラスのactivityViewControllerメソッドからカスタム ビュー コントローラーへの参照を返します。

UIActivity クラスリファレンスによると:

activityViewController

このメソッドのデフォルトの実装は を返しますnil。ビュー コントローラーを使用して追加の UI を提供するサブクラスは、このメソッドをオーバーライドして、そのビュー コントローラーを返すことができます。このメソッドが有効なオブジェクトを返す場合、システムはperformActivityメソッドを呼び出す代わりに、返されたビュー コントローラーを表示します。iPad では、View Controller はポップオーバー内に表示されます。iPhone と iPod touch では、View Controller はモーダルに表示されます。

カスタム ビュー コントローラーは、カスタム UI を備えたビューを提供し、それらのビュー内のユーザー インタラクションを処理する必要があります。アクティビティが完了したら、View Controller を自分で閉じないでください。代わりに、メソッドを呼び出してactivityDidFinish:、システムに却下させてください。

最初の段落の最後の部分に注意してください。iPad では、View Controller はポップオーバー内に表示されます。iPhone と iPod touch では、View Controller はモーダルに表示されます。

ただし、iPad ではactivityViewController、UIActivityViewController を (モーダルまたはポップオーバー経由で) どのように提示しても、返されるビュー コントローラーは常にモーダルに表示されます。ポップオーバーを介して表示すると、閉じられたとは見なされないため、クラッシュが発生します。

私は何を間違っていますか?これは iOS 6 のバグですか?


更新: これは、問題を説明する単純な Xcode プロジェクトです。自由にクローンを作成して遊んで、どこが間違っているのかを確認してください: github.com/simonwhitaker/GSActivityDemo

4

4 に答える 4

23

UIActivityViewController について話しているように、これはユーザーが利用できるアクティビティを表示するビューです。Appleは次のように述べています...

アプリは、このビュー コントローラーの構成、表示、および破棄を担当します。ビュー コントローラの構成には、ビュー コントローラが動作するデータ オブジェクトの指定が含まれます。(アプリがサポートするカスタム サービスのリストを指定することもできます。) View Controller を表示するときは、現在のデバイスに適した手段を使用して表示する必要があります。iPad では、View Controller をポップオーバーに表示する必要があります。iPhone および iPod touch では、モーダルで表示する必要があります。

最後の行は、ビューの表示方法を処理する必要があることを示しているため、コードが iPad で実行されているかどうかを確認し、それに応じて UIPopover を使用します。ここでわかるように... https://github.com/bufferapp/buffer-uiactivity/blob/master/BufferUIActivity/Views/FirstViewController.m以下のメソッド内。

-(IBAction)openUIActivityView:(id)sender {

    NSString *text = @"Hello world";
    NSString *url = @"http://bufferapp.com";


    NSArray *activityItems = @[text, url];

    BufferUIActivity *bufferActivity = [[BufferUIActivity alloc] init];

    UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:@[ bufferActivity ]];


    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self presentViewController:activityView animated:YES completion:^{

        }];
    } else {
        // Change Rect to position Popover
        self.popup = [[UIPopoverController alloc] initWithContentViewController:activityView];
        [self.popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.width/2, 100, 100) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }

}
于 2012-11-20T09:49:28.450 に答える
3

アクティビティ ビュー コントローラーがポップオーバーに表示されない問題はバグであり、ドキュメントには正しい意図が反映されていると思います。ただし、この atm を回避する方法はわかりません。

ただし、View Controller を閉じる部分は別の問題です。から戻ったView Controllerを閉じることは想定されていません、提示したポップオーバーを閉じる責任があります。これにより、カスタムView Controllerも階層から削除されます-[UIActivity activityViewController]。(そして、このように動作するため、通常はカスタム ビュー コントローラーをポップオーバーに表示する必要があると思いがちです。)

サンプルアプリのコードを使用した例を次に示します。

UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:activityItems
                                                                 applicationActivities:applicationActivities];

vc.completionHandler = ^(NSString *activityType, BOOL completed){
  [self.activityPopoverController dismissPopoverAnimated:YES];
};
于 2012-11-20T11:32:25.887 に答える
1


iOS 7 でも同じ問題がありました。カスタム ビューをポップオーバーに表示する解決策は、-(void)performActivityメソッドで返すのではなく、メソッドで作成して表示することです-(UIViewController *)activityViewController

このリンクの下の私の質問/回答でコード例を見ることができます:
iOS 7 custom UIActivity as popover

于 2014-05-20T09:47:59.810 に答える