0

後続のコードをトリガーする前に、Objective-C コードが UIAlertView からのユーザー入力を適切に待機するようにするには、多くの問題があります。たとえば、次のコードがあります。

if (!self.currentUser) [self displayLoginUIAlertView];
Program *program = [[Program alloc] initWithUser:self.currentUser];
[program startProgram];

どこProgramがカスタム オブジェクトで、どこからのユーザー入力[self displayLoginUIAlertView]がプロパティを設定するかself.currentUser

2 行目と 3 行目 (とには、View Controller 内のさまざまな種類のアラート ビューの数を制限しようとしているため、入れたくないでしょう。さらに、独自のカスタムの完全モーダル UIAlertViewオブジェクト(オンラインのいくつかのソリューションが示唆しているように見えます)。Program *program[program startProgram]alertView:didDismissWithButtonIndex

私が探している答えは、UIAlertView オブジェクトを超えて一般化できることを願っており、Objective-C の行が完全に実行されるのを待ってから次のコード行に進む方法についてのより一般的な質問に答えるのに役立ちます。私も次のことを試しました:

if (!self.currentUser) [self displayLoginUIAlertView];
while (!self.currentUser) wait(1);
Program *program = [[Program alloc] initWithUser:self.currentUser];
[program startProgram];

ただし、これは (当然のことながら) 無限ループにつながり、アラート ビューが表示されず、ユーザー入力がロックアウトされます。

ブロックの使用を検討しましたが、その構文に非常に混乱しています。ブロックは解決策ですか?それとも、私は間違った質問をしていますか?

4

3 に答える 3

6

適切な方法は、実際にalertView:didDismissWithButtonIndex:at al を実装することです。

ただし、コールバック ブロックを受け取り、 のデリゲートとして機能するオブジェクトを作成したい場合もありますがUIAlertView、それは価値があるよりも面倒だと思います.. (デリゲート オブジェクトをインスタンス変数への参照に保持する必要があります。見捨てられないようにする)

于 2012-09-07T18:57:46.807 に答える
3

一般的に言えば、ブロックが答えですが、API がブロックをサポートしている場合に限られます。アラート ビューの場合は、そうではありません。たとえば、ブロックをサポートするように拡張するのはかなり簡単ですUIAlertView-Blocks

ランタイムに「一時停止」するように指示しようとする試みは、スターターではありません。システムはそのように使用するように設計されていないため、メソッドから戻るまで UI は機能しません。その方法ではどこにも行きません。

于 2012-09-07T18:59:00.010 に答える
0

Apple は、この機能をプログラム フローを中断するのではなく、メソッドが完了する直前に表示されるように設計しました。

UIAlert をエンドポイントとして使用し、アラートのボタン タップを受け取るデリゲート内で実行をフォークします。

アラートを表示するための呼び出しの直後にメソッドが完了すると、プログラムはユーザーのアクションを待機し、デリゲートが制御を引き継ぎ、ユーザーが何かをクリックした後にのみプログラム フローが再開されます。

于 2013-05-18T14:02:48.877 に答える