変数をUIAlertView
デリゲートにどのように渡しますか?
アラートビューデリゲートで使用したい変数があります。 UIAlertView
とUIAlertView
デリゲートを表示する関数でのみ使用されるため、コントローラーのプロパティである必要はないと思います。変数をUIAlertView
にアタッチして、デリゲートで取得する方法はありますか?
- (void) someUserCondition:(SOCode *)userCode {
if ([userCode warrentsConfirmation] > 0) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Are you sure?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK",nil];
[alert setAlertViewStyle:UIAlertViewStyleDefault];
//TODO somehow store the code variable on the alert view
[alert show];
}
}
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
if ([title isEqualToString:@"OK"]){
SOCode *userCode = //TODO somehow get the code from the alert view
[self continueWithCode:code];
}
}
インターフェイスの前の.h:
extern const char MyConstantKey;
@interface ViewController...
.mインポート:
import <objc/runtime.h>
実装前の.m
const char MyConstantKey;
.m実装で
-(void)viewDidAppear:(BOOL)animated{ //or wherever
NSString *aString = @"This is a string";
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Testing" message:@"test is test" delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil];
[alert show];
[alert release];
objc_setAssociatedObject(alert, &MyConstantKey, aString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
.mアラートビューコールバック
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
NSString *associatedString = objc_getAssociatedObject(alertView, &MyConstantKey);
NSLog(@"associated string: %@", associatedString);
}
関連するオブジェクトを使用します。ここでより詳細に説明されています: あなたの新しい友達:Obj-C関連オブジェクト
使用するオブジェクトを設定するには、次を使用します。
objc_setAssociatedObject(alert, &key, userCode, OBJC_ASSOCIATION_RETAIN);
そしてそれを取り戻すために:
SOCode *userCode = objc_getAssociatedObject(alertView, &key);
また、蛾のメソッドの範囲内になるようにstatic char key;
を追加する必要があります。
これをUIAlertView
のカテゴリにまとめました。 Cocoapodsを使用して次のものを取り込むことができます。
pod 'HCViews/UIAlertViewHCContext', '~> 1.2'
ソースはここから入手できます: https://github.com/hypercrypt/HCViews/blob/master/Categories/UIAlertView%2BHCContext.h
多くの投稿で、関連するオブジェクトの背後にある概念について説明していますが(これは良いことです!)、コードを見たいだけの場合もあります。これは、別のファイルに入れるか、既存の.m
ファイルの1つのインターフェイスの上に置くことができるクリーンで迅速なカテゴリです(UIAlertView
をNSObject
に効果的に置き換えることもできますcontext
プロパティを任意のオブジェクトに追加します):
#import <objc/runtime.h>
@interface UIAlertView (Private)
@property (nonatomic, strong) id context;
@end
@implementation UIAlertView (Private)
@dynamic context;
-(void)setContext:(id)context {
objc_setAssociatedObject(self, @selector(context), context, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(id)context {
return objc_getAssociatedObject(self, @selector(context));
}
@end
そして、次のようなことができるようになります。
NSObject *myObject = [NSObject new];
UIAlertView *alertView = ...
alertView.context = myObject;
重要:そしてdealloc
のコンテキストをゼロにすることを忘れないでください!!
UIAlertView
はUIView
のサブクラスであり、整数に設定できるtag
プロパティがあります。残念ながら、デリゲートに情報を識別/渡すために整数以外のものが必要な場合は、デリゲート自体にいくつかのプロパティを設定する(またはタグがインデックス付けされた配列を設定する)必要があります。 Advaithの方法はおそらく機能しますが、技術的にはAppleによってサポートされていません。
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Are you sure?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK",nil];
[alert setAlertViewStyle:UIAlertViewStyleDefault];
alert.tag = SOMEINTEGER;
[alert show];
最も簡単な方法は、アラートビューのデリゲートクラスのプロパティだと思います。アラートビューには「ユーザー情報」のプロビジョニングがなく、頭に浮かぶショートカットのみを削除するサブクラス化をサポートしていません。
UIAlertViewをサブクラス化し、選択したタイプのuserInfoというプロパティを追加します。サブクラス化されたUIAlertViewのインスタンスを作成するときにユーザー情報の値を設定し、デリゲートメソッド内から取得します。 (そこで、userInfoを保持するサブクラス化されたインスタンスを取得します)