web-dev-qa-db-ja.com

UIAlertViewデリゲートに変数をどのように渡しますか?

変数をUIAlertViewデリゲートにどのように渡しますか?

アラートビューデリゲートで使用したい変数があります。 UIAlertViewUIAlertViewデリゲートを表示する関数でのみ使用されるため、コントローラーのプロパティである必要はないと思います。変数を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];
    }                                 
}
24
wusher

インターフェイスの前の.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);

}
26
warpedspeed

関連するオブジェクトを使用します。ここでより詳細に説明されています: あなたの新しい友達: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

14
hypercrypt

多くの投稿で、関連するオブジェクトの背後にある概念について説明していますが(これは良いことです!)、コードを見たいだけの場合もあります。これは、別のファイルに入れるか、既存の.mファイルの1つのインターフェイスの上に置くことができるクリーンで迅速なカテゴリです(UIAlertViewNSObjectに効果的に置き換えることもできます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のコンテキストをゼロにすることを忘れないでください!!

7
Anthony

UIAlertViewUIViewのサブクラスであり、整数に設定できる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];
3
Russ

最も簡単な方法は、アラートビューのデリゲートクラスのプロパティだと思います。アラートビューには「ユーザー情報」のプロビジョニングがなく、頭に浮かぶショートカットのみを削除するサブクラス化をサポートしていません。

1
Phillip Mills

UIAlertViewをサブクラス化し、選択したタイプのuserInfoというプロパティを追加します。サブクラス化されたUIAlertViewのインスタンスを作成するときにユーザー情報の値を設定し、デリゲートメソッド内から取得します。 (そこで、userInfoを保持するサブクラス化されたインスタンスを取得します)

0
Advaith