如何将变量传递给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];
}
}
答案 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)
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];
答案 4 :(得分:1)
我怀疑最直接的方式是警报视图的委托类中的属性。警报视图没有“用户信息”的任何规定,也不支持子类,这会删除想到的唯一快捷方式。
答案 5 :(得分:0)
UIAlertView子类,使用您选择的类型添加名为userInfo的属性。在创建Subclassed UIAlertView实例时设置用户信息值,并从委托方法中检索它。 (在那里你将获得保存userInfo的子类实例)