Iphone 如何将userInfo添加到UIAlertView?

Iphone 如何将userInfo添加到UIAlertView?,iphone,objective-c,nsdictionary,uialertview,userinfo,Iphone,Objective C,Nsdictionary,Uialertview,Userinfo,我想知道如何将userInfo对象或任何NSDictionary添加到UIAlertView 谢谢。您可以尝试将UIAlertView子类化以添加字段,或者在委托类中存储引用。但将任何对象附加到任何其他对象的最常用方法是使用objc\u setAssociatedObject NSDictionary *myDictionary = objc_getAssociatedObject(alertView, &fooKey); 为此,您必须导入,并且需要一个任意的void*,用作密钥(通常

我想知道如何将userInfo对象或任何NSDictionary添加到UIAlertView


谢谢。

您可以尝试将UIAlertView子类化以添加字段,或者在委托类中存储引用。但将任何对象附加到任何其他对象的最常用方法是使用
objc\u setAssociatedObject

NSDictionary *myDictionary = objc_getAssociatedObject(alertView, &fooKey);
为此,您必须导入,并且需要一个任意的void*,用作密钥(通常的技巧是在.m文件中声明一个静态字符fooKey;,并使用其地址)。然后可以按如下方式附着对象:

objc_setAssociatedObject(alertView, &fooKey, myDictionary, OBJC_ASSOCIATION_RETAIN);
在这种情况下,myDictionary将在alertView的生命周期内保留,并在alertView解除分配时释放

要稍后检索关联对象,请使用逻辑名称为
objc\u getAssociatedObject

NSDictionary *myDictionary = objc_getAssociatedObject(alertView, &fooKey);
如果没有关联集,则返回
nil
。要断开关联,只需使用
objc_setAssociatedObject
为同一对象和键关联一个新值
nil
可用于在不关联新对象的情况下中断关联

列出了除OBJC_association_RETAIN之外的关联类型的其他值

如果我给它一个文本c字符串,比如“key”,而不是创建一个静态字符,那么它对我来说是有效的

相反,考虑到Anomie所说的,你可以这样做:

objc_setAssociatedObject ( alert , (const void*)0x314 , notification , OBJC_ASSOCIATION_RETAIN ) ;
这适用于任何允许您使用任意void*(观察、此函数等)并且不需要额外的静态变量技巧的情况。此外,(const void*)0x314始终是0x314,无论编译器执行什么操作

还有,Anomie,你刚刚在我正在开发的一个应用程序中为我节省了很多工作。谢谢

如果您使用的是iOS 4.0(适用于块),并且您只需要一个或两个按钮,那么您可以使用我制作的以下类别:

它绕过了添加用户信息的需要,因为您将单击处理功能直接放入警报中。e、 g

 #import UIAlertView+Blocks.h

 ...

 ...

 NSString* myUserInfo = @"example";

 [UIAlertView displayAlertWithTitle:@"Example Alert View With Blocks"
                            message:nil
                    leftButtonTitle:@"Ok"
                  leftButtonAction:^{
                                      NSLog(@"%@", myUserInfo);
                                    } 
                  rightButtonTitle:nil
                 rightButtonAction:nil];
我在
NSObject
上编写了一个(经过良好测试的)类别,使每个对象都能够轻松存储数据

只需将代码放在头文件和实现文件中,并将其导入到任何项目中。或者把它放在一个静态库中。仅限Mac OS X 10.6+和iOS(版本?)

#导入
#进口
@接口对象(CCFoundation)
-(id)AssociationObjectForkey:(NSString*)键;
-(void)setAssociationObject:(id)object forKey:(NSString*)键;
@结束
#布拉格标记-
@实现NSObject(CCFoundation)
静态字符关联objectskey;
-(id)AssociationObjectForkey:(NSString*)键{
NSMutableDictionary*dict=objc_getAssociatedObject(self和associatedObjectsKey);
返回[dict objectForKey:key];
}
-(void)SetAssociationObject:(id)object forKey:(NSString*)键{
NSMutableDictionary*dict=objc_getAssociatedObject(self和associatedObjectsKey);
如果(!dict){
dict=[[NSMutableDictionary alloc]init];
objc_setAssociatedObject(self和associateveobjectskey、dict、objc_ASSOCIATION_RETAIN);
}[dict setObject:object forKey:key];
}
@结束
简单地说,只要您需要,每个对象都会成为一个易于使用的字典(多亏了
NSMutableDictionary
)。当对象被释放时,字典被释放;当字典被释放时,字典的对象被释放。令人惊讶的是,苹果是如何做到这一点的

警告1:上述代码已启用弧。它经过了良好的测试,并在多个装运产品中使用。我还没有看到任何内存泄漏或性能问题

警告2:根据需要重命名方法,但如果选择保留名称,请确保添加前缀。这是根对象“人”上的一个类别。某处的某个类正在使用此方法名,您不想干预!我在每个项目中包含的静态库使用方法名
associateveccobjectforkey:
setassociateveccobject:forKey:


我希望这能帮助任何想要在每个对象上都有一个简单的
userInfo
功能的人。不客气!:-)

我想出了一个更简单的解决方案,可能适合某些情况。因为在调用委托时会得到NSAlertView上下文,所以我使用对象的实际地址创建一个标记(NSString*),然后使用该标记将自定义值存储在全局或特定于对象的NSDictionary中。以下是一个例子:

+(NSString*)GetTag:(id)ObjectIn
{
    return [NSString stringWithFormat:@"Tag-%i",(int)ObjectIn];
}
在代表中:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString* MyID = [CommandManager GetTag:alertView];
    [CurrentActiveAlerts removeObjectForKey:MyID];
}
电话:

    UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:title_text
                                                          message:@""
                                                     delegate:self
                                            cancelButtonTitle:nil
                                        otherButtonTitles:button_text ,nil];

    CurrentActiveAlerts[[CommandManager GetTag:myAlert]] = CommandToRun;  
    [myAlert show];
    [myAlert release];

这些键最终看起来像“Tag-226811776”。希望这有帮助。

谢谢@Anomie!这是我的代码:
-(void)setObject:(id)object{objc_setAssociatedObject(self,&fooKey,object,objc_associated_RETAIN)}-(id)object{return objc_getAssociatedObject(self,&fooKey);}
这很酷。如果我给它一个文本c字符串,比如“key”,而不是创建一个静态字符,这对我来说是可行的,因为我所做的全部工作是避免创建全局/类变量(userInfo可以改为创建全局/类变量)。假设两个相同的c字符串文本将指向同一个内存位置是否安全?@ZakyGerman:不完全安全。C标准(Objective-C的基础)说:“如果[字符串文字的字符数组]的元素具有适当的值,那么它们是否是不同的,这是不确定的。”这意味着允许编译器使
“key”
的所有实例指向相同的内存位置,或指向不同的位置,或者两者兼有。您是否从链接下载了UIAlertView+Blocks.h并包含了行
#import UIAlertView+Blocks.h
?是的,我添加了。我已经解决了创建新类的问题,而不是将
UIAlerView+Blocks.h
添加到项目中如何通过pod导入项目?很好。我将我的类别命名为arbitraryobjectonanynsobjectlol。啊。。。obj-c命名空间冲突。。。我无法将关联对象添加到