UIAlertView
現在、あちこちでクラスがポップアップしています。現在、同じクラスがこれらのデリゲートです(そうなるのは非常に論理的です)。残念ながら、これらUIAlertView
はクラスの同じデリゲートメソッドを呼び出します。さて、問題は、デリゲートメソッドがどのアラートビューから呼び出されているかをどうやって知るのかということです。アラートビューのタイトルを確認することだけを考えていましたが、それほどエレガントではありません。いくつかを処理するための最もエレガントな方法は何UIAlertView
ですか?
5 に答える
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) {
// ...
}
}
参考までに、iOS 4ユーザーのみをターゲットにする場合(クライアントの約98.5%に少なくともiOS 4がインストールされているので合理的です)、Blocksを使用してUIAlertViewsの非常に優れたインライン処理を実行できるはずです。
これはそれを説明するStackoverflowの質問です:
UIAlertViewDelegateのブロック
これには、ZacharyWaldowskiのBlocksKitフレームワークを使用してみました。彼のUIAlertView(BlocksKit)APIリファレンスは本当に良さそうです。しかし、私は彼の指示に従ってBlocksKitフレームワークをプロジェクトにインポートしようとしましたが、残念ながらそれを機能させることができませんでした。
したがって、CanBerkGüderが示唆しているように、私は今UIAlertView
のところタグを使用しています。しかし、将来のある時点で、ブロック(できれば、そのままARCをサポートするブロック)の使用に移行しようとしています!
より簡単で新しい
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...
}
}
全部終わった!
UIAlertViewを拡張してブロックコールバックを使用することで、この試練全体を克服し、タグの使用を防ぐことができます。私がこのテーマについて書いたこのブログ投稿をチェックしてください。
タグの使用はちょっとしたハックだといつも思っていました。それらを使用する場合は、少なくともタグ番号にいくつかの定義済み定数を設定してください。
代わりに、次のようなプロパティを使用します。
インターフェイスセクション:
@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
}