web-dev-qa-db-ja.com

デリゲートのいくつかのUIAlertView

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

38
quano

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

#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) {
        // ...
    }
}
102
Can Berk Güder

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

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

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

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

4
Dan J

より簡単で新しい

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...
    }
}

出来た!

3
nima sp

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

1
Stavash

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

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

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

@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
  }
0
Marcus Adams