如何将userInfo添加到UIAlertView?

aLt*_*aLt 16 iphone objective-c nsdictionary uialertview userinfo

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

谢谢.

Ano*_*mie 31

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

要做到这一点,你必须#import <objc/runtime.h>,并且你需要一个任意void *的用作键(通常的技巧是static char fooKey;在你的.m文件中声明一个并使用它的地址).然后你可以像这样附加对象:

objc_setAssociatedObject(alertView, &fooKey, myDictionary, OBJC_ASSOCIATION_RETAIN);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,myDictionary将在alertView的生命周期内保留,并在取消分配alertView时释放.

要在以后检索关联的对象,请使用逻辑命名的objc_getAssociatedObject.

NSDictionary *myDictionary = objc_getAssociatedObject(alertView, &fooKey);
Run Code Online (Sandbox Code Playgroud)

nil如果没有关联集,则返回.要打破关联,只需使用objc_setAssociatedObject相关对象和键的新值关联; nil可用于在不关联新对象的情况下中断关联.

此处列出 OBJC_ASSOCIATION_RETAIN之外的关联类型的其他值.

  • @ZakyGerman:不完全安全.C标准(Objective-C所基于的)表示"如果[字符串文字的字符数组]是不同的,只要它们的元素具有适当的值,就没有说明." 这意味着编译器允许所有"key"实例指向相同的内存位置,或者指向不同的位置或两者中的某些位置. (3认同)

Con*_*has 15

我写了一个(经过良好测试的)类别,NSObject它为每个对象提供了轻松存储数据的能力.

只需将代码放在标题和实现文件中,然后将其导入任何项目中.或者将它放在静态库中.仅适用于Mac OS X 10.6+和iOS(版本?).

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface NSObject (CCFoundation)

- (id)associativeObjectForKey: (NSString *)key;
- (void)setAssociativeObject: (id)object forKey: (NSString *)key;

@end

#pragma mark -

@implementation NSObject (CCFoundation)

static char associativeObjectsKey;

- (id)associativeObjectForKey: (NSString *)key {
    NSMutableDictionary *dict = objc_getAssociatedObject(self, &associativeObjectsKey);
    return [dict objectForKey: key];
}

- (void)setAssociativeObject: (id)object forKey: (NSString *)key {
    NSMutableDictionary *dict = objc_getAssociatedObject(self, &associativeObjectsKey);
    if (!dict) {
        dict = [[NSMutableDictionary alloc] init];
        objc_setAssociatedObject(self, &associativeObjectsKey, dict, OBJC_ASSOCIATION_RETAIN);
    } [dict setObject: object forKey: key];
}

@end
Run Code Online (Sandbox Code Playgroud)

简而言之,只要NSMutableDictionary您需要,每个对象都会变成一个易于使用的字典(感谢).当对象出现时释放字典,并且在释放字典时释放字典的对象.苹果公司如此简单,令人惊讶.

警告1:上面的代码启用了ARC.它经过了充分测试,可用于多种产品.我没有看到任何内存泄漏或性能问题.

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

我希望这有助于任何想要userInfo在每个对象上都有类似简单特征的人.别客气!:-)


Rob*_*ert 11

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

https://github.com/rsaunders100/UIAlertView-Blocks

它绕过了添加用户信息的需要,因为您将点击handeling功能直接放入警报中.例如

 #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];
Run Code Online (Sandbox Code Playgroud)