9

UIActivity独自のサブクラスを作成しますactivityViewController

- (UIViewController *)activityViewController {
    WSLInProgressViewController* progressView = [[[WSLInProgressViewController alloc] init] autorelease];
    progressView.message = [NSString stringWithFormat:NSLocalizedString(@"Posting to %@...",@"Posting to..."),
                        self.activityType];

    return progressView;
}

GitHubに完全な再現を追加しました。


ドキュメントによると、これを手動で却下することは想定されていません。代わりに、OS は呼び出し時にそれを行いますactivityDidFinish:。これは、iPhone で実行すると問題なく動作します。

私が「動作する」と言うとき、これは私が期待している (そして iPhone で見られる) イベントのシーケンスです:

  1. 表示するUIActivityViewController
  2. ユーザーがカスタム アクティビティを押す
  3. 私のView Controllerが表示されます
  4. 電話するactivityDidFinish:
  5. カスタム ビュー コントローラーが閉じられました
  6. UIActivityViewControllerも解任される

ただし、この同じコードを iPad シミュレーターで実行すると (唯一の違いはUIActivityViewController、ドキュメントに記載されているように、ポップアップに配置することです)、activityViewController決して閉じません。

私が言うように、これはiPhone でpopUP がactivityDidFinish:機能するコードであり、コードをステップ実行したので、それが呼び出されていることがわかります。

この Radar がベータ 3で同じ問題iOS6について話しているのを見つけましたが、OS ではなくコードのバグを疑うほど基本的な機能のようです (Twitter および Facebook の機能で正しく動作することにも注意してください!)。


何か不足していますか?で実行するとき、 activityViewController で何か特別なことをする必要がありUIPopoverViewControllerますか? iPadでは「流れ」が違うはずですか?

4

8 に答える 8

8

自動却下は、「アクティビティ」コントローラーが直接提示された場合にのみ発生し、何にもラップされていないように見えます。したがって、ポップアップを表示する直前に、それがラップされているので、完了ハンドラーを追加します

activity.completionHandler = ^(NSString *activityType, BOOL completed){
   [self.popup dismissPopoverAnimated:YES];
};

そして、あなたは元気になります。

于 2012-10-03T01:15:20.373 に答える
4

質問はかなり古いと思いますが、ここで同じview-controller-not-dismissingの問題をデバッグしてきました-dismissPopoverAnimated:.

UIActivity に関するドキュメントは非常にまばらであり、実装を構造化する方法を示唆していますが、質問はそれがそれほど明白ではないことを示しています。

最初に気付くべきことは、ビュー コントローラーを手動で閉じるべきではないとドキュメントに記載されていることです。これは実際に当てはまります。

ドキュメントに記載されていないこと、および非非表示ビューコントローラーの問題のデバッグに遭遇したときに観察できることは、対象のビューコントローラーへの参照が必要なときにiOSメソッドを呼び出すことです。-activityViewController結局のところ、おそらく iPad でのみ、iOS は実際には返されたビュー コントローラー インスタンスをその構造体のどこにも保存せず、ビュー コントローラーを閉じたいときに、単に-activityViewControllerオブジェクトを要求してから閉じます。したがって、メソッドへの最初の呼び出し (表示されたとき) でインスタンス化されたビュー コントローラーは決して破棄されません。ああ。これが問題の原因です。

これを適切に修正するにはどうすればよいでしょうか。

ドキュメントをさらにスキミングするとUIActivity、メソッドに出くわす可能性があり-prepareWithActivityItems:ます。特定のヒントは、次のテキストにあります。

サービスの実装で追加の UI をユーザーに表示する必要がある場合は、このメソッドを使用してビュー コントローラー オブジェクトを準備し、それを activityViewController メソッドから使​​用できるようにすることができます。

そのため、ビュー コントローラーを-prepareWithActivityItems:メソッド内でインスタンス化し、それをインスタンス変数に組み込むという考え方です。-activityViewController次に、メソッドから同じインスタンスを返すだけです。

-activityDidFinish:これにより、手動での介入なしでメソッドを呼び出した後、View Controller は適切に非表示になります。

ビンゴ。

注意!これをもう少し掘り下げると、呼び出されるたびに新しいView Controllerをインスタンス化する-prepareWithActivityItems:べきではありません。以前に作成したことがある場合は、単に再利用する必要があります。私たちの場合、そうしなければ喜んでクラッシュしました。

これが誰かに役立つことを願っています。:)

于 2013-06-06T12:19:37.703 に答える
2

私も同じ問題を抱えていました。activityViewController をメンバーとして保存し、保存されたコントローラーを返すことで解決しました。アクティビティは新しいオブジェクトを返し、新しいオブジェクトで呼び出されます。

    - (UIViewController *)activityViewController {
        if (!self.detaisController) {
            // create detailsController
        }
        return self.detailsController;
    }
于 2013-05-30T14:55:27.803 に答える
1

UIActivity を別のビューに渡し、次を呼び出します...

[myActivity activityDidFinish:YES];

これは、私のデバイスだけでなく、シミュレーターでも機能します。以前行っていたように、UIActivity .m ファイルの activityDidFinish メソッドをオーバーライドしていないことを確認してください。ここで使用しているコードを見ることができます。

于 2012-09-27T12:39:43.900 に答える
0

絵コンテを使っていますか?たぶんあなたのiPadストーリーボードで、UIActivityIndicatorView「停止時に非表示」のチェックがありませんか?

それが役に立てば幸い!

于 2012-09-22T12:42:10.097 に答える
0

だから私は同じ問題を抱えていました。私はカスタム activityViewController を持つカスタム UIActivity を持っていました。ユーザーにとって同じエクスペリエンスを維持するために私が選択した回避策は、カスタム UIActivity を引き続き使用し、そのアクティビティにデリゲートを与えることでした。したがって、私の UIActiviy サブクラスには次のものがあります。

- (void)performActivity
{
    if ([self.delegate respondsToSelector:@selector(showViewController)]) {
        [self.delegate showViewController];    
    }

    [self activityDidFinish:YES];
}

- (UIViewController *)activityViewController
{
    return nil;
}

次に、UIActivityViewController を表示するビュー コントローラーをデリゲートにします。これにより、デリゲート メソッドの activityViewController に表示されるビュー コントローラーが表示されます。

于 2014-01-29T19:14:56.533 に答える
-1

最後にリリースするのはどうですか?非アークプロジェクトを使用しています!

[progressView release];

多くのユーザーがあなたと同じ問題を抱えています!別の解決策は次のとおりです。

UIActivityIndicatorView *progress= [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125, 50, 30, 30)];
progress.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
[alert addSubview:progress];
[progress startAnimating];

ストーリーボードを使用している場合は、アクティビティインをクリックするときに必ずクリックしてください。「停止時に非表示」をクリック!

お役に立てば幸いです...

于 2012-10-02T22:33:14.393 に答える