24

どのように変数を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];
    }                                 
}
4

6 に答える 6

26

インターフェイスの前の .h:

extern const char MyConstantKey;
@interface ViewController...

.m インポート:

import <objc/runtime.h>

in .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);

 }

in .m alertview コールバック

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

     NSString *associatedString = objc_getAssociatedObject(alertView, &MyConstantKey);

     NSLog(@"associated string: %@", associatedString);

}
于 2012-04-30T21:00:37.537 に答える
14

関連オブジェクトを使用します。ここで詳しく説明されています: Your New Friends: Obj-C Associated Objects

使用するオブジェクトを設定するには:

objc_setAssociatedObject(alert, &key, userCode, OBJC_ASSOCIATION_RETAIN);

そして、それを取り戻すには:

SOCode *userCode = objc_getAssociatedObject(alertView, &key);

static char key;また、moth メソッドのスコープ内になるように追加する必要があります。

アップデート

これを のカテゴリにまとめましたUIAlertView。Cocoapods を使用して持ち込むことができます。

pod 'HCViews/UIAlertViewHCContext', '~> 1.2'

ソースはこちらから入手できます: https://github.com/hypercrypt/HCViews/blob/master/Categories/UIAlertView%2BHCContext.h

于 2012-04-30T20:36:58.283 に答える
3

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];
于 2012-04-30T20:44:45.377 に答える
1

最も簡単な方法は、アラート ビューのデリゲート クラスのプロパティだと思います。アラート ビューには「ユーザー情報」の規定がなく、サブクラス化がサポートされていないため、頭に浮かぶ唯一のショートカットが削除されます。

于 2012-04-30T17:35:17.760 に答える
0

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

于 2012-04-30T20:32:46.260 に答える