37

UIAlertView現在、あちこちでクラスがポップアップしています。現在、同じクラスがこれらのデリゲートです(そうなるのは非常に論理的です)。残念ながら、これらUIAlertViewはクラスの同じデリゲートメソッドを呼び出します。さて、問題は、デリゲートメソッドがどのアラートビューから呼び出されているかをどうやって知るのかということです。アラートビューのタイトルを確認することだけを考えていましたが、それほどエレガントではありません。いくつかを処理するための最もエレガントな方法は何UIAlertViewですか?

4

5 に答える 5

100

UIAlertView次のようにタグを付けます。

#define kAlertViewOne 1
#define kAlertViewTwo 2

UIAlertView *alertView1 = [[UIAlertView alloc] init...
alertView1.tag = kAlertViewOne;

UIAlertView *alertView2 = [[UIAlertView alloc] init...
alertView2.tag = kAlertViewTwo;

次に、これらのタグを使用してデリゲートメソッドでそれらを区別します。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(alertView.tag == kAlertViewOne) {
        // ...
    } else if(alertView.tag == kAlertViewTwo) {
        // ...
    }
}
于 2010-02-26T00:47:05.663 に答える
4

参考までに、iOS 4ユーザーのみをターゲットにする場合(クライアントの約98.5%に少なくともiOS 4がインストールされているので合理的です)、Blocksを使用してUIAlertViewsの非常に優れたインライン処理を実行できるはずです。

これはそれを説明するStackoverflowの質問です:
UIAlertViewDelegateのブロック

これには、ZacharyWaldowskiのBlocksKitフレームワークを使用してみました。彼のUIAlertView(BlocksKit)APIリファレンスは本当に良さそうです。しかし、私は彼の指示に従ってBlocksKitフレームワークをプロジェクトにインポートしようとしましたが、残念ながらそれを機能させることができませんでした。

したがって、CanBerkGüderが示唆しているように、私は今UIAlertViewのところタグを使用しています。しかし、将来のある時点で、ブロック(できれば、そのままARCをサポートするブロック)の使用に移行しようとしています!

于 2012-04-16T02:22:28.137 に答える
3

より簡単で新しい

UIAlertView *alert = [[UIAlertView alloc] init...
alert.tag = 1;

UIAlertView *alert = [[UIAlertView alloc] init...
alert.tag = 2;



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(alertView.tag == 1) {
        // first alert...
    } else  {
        // sec alert...
    }
}

全部終わった!

于 2013-08-10T20:08:51.687 に答える
1

UIAlertViewを拡張してブロックコールバックを使用することで、この試練全体を克服し、タグの使用を防ぐことができます。私がこのテーマについて書いたこのブログ投稿をチェックしてください。

于 2013-01-31T21:55:01.883 に答える
0

タグの使用はちょっとしたハックだといつも思っていました。それらを使用する場合は、少なくともタグ番号にいくつかの定義済み定数を設定してください。

代わりに、次のようなプロパティを使用します。

インターフェイスセクション:

@property (nonatomic, weak) UIAlertView *overDueAlertView;
@property (nonatomic, weak) UIAlertView *retryPromptAlertView;

アラートビューの作成:

UIAlertView *alert = [[UIAlertView alloc] init...
self.overDueAlertView = alert;
[alert show];

デリゲートメソッド:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  if (alertView == self.overDueAlertView) {
    // Overdue alert
  } else if (alertView == self.retryPromptAlertView) {
    // Retry alert
  }
于 2015-08-11T14:40:01.563 に答える