如何将变量传递给UIAlertView委托?

时间:2012-04-30 17:25:47

标签: iphone objective-c ios 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];
    }                                 
}

6 个答案:

答案 0 :(得分:26)

在接口前的.h:

extern const char MyConstantKey;
@interface ViewController...
<。>导入:

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 alertview回调中

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

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

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

}

答案 1 :(得分: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;,以使其属于蛾方法的范围。

更新

我已将其打包到UIAlertView的类别中。您可以使用Cocoapods将其带入:

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

可在此处获取来源:https://github.com/hypercrypt/HCViews/blob/master/Categories/UIAlertView%2BHCContext.h

答案 2 :(得分:7)

很多帖子都谈到关联对象背后的概念(这很好!)但有时候你只想看看代码。这是一个简洁明快的类别,您可以将其放在单独的文件中,也可以放在现有.m个文件的界面之上(您甚至可以用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 !!

中忽略上下文

答案 3 :(得分:3)

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];

答案 4 :(得分:1)

我怀疑最直接的方式是警报视图的委托类中的属性。警报视图没有“用户信息”的任何规定,也不支持子类,这会删除想到的唯一快捷方式。

答案 5 :(得分:0)

UIAlertView子类,使用您选择的类型添加名为userInfo的属性。在创建Subclassed UIAlertView实例时设置用户信息值,并从委托方法中检索它。 (在那里你将获得保存userInfo的子类实例)