首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在UIAlertView中添加userInfo?

如何在UIAlertView中添加userInfo?
EN

Stack Overflow用户
提问于 2011-03-12 08:31:28
回答 3查看 9K关注 0票数 16

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

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-24 17:37:37

如果你使用的是> iOS 4.0 (对于块),并且你只想要一个或两个按钮,你可以使用我创建的这个类别:

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

它绕过了添加用户信息的需要,因为您将单击处理函数直接放入警报中。例如:

代码语言:javascript
复制
 #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];
票数 11
EN

Stack Overflow用户

发布于 2011-03-12 09:13:16

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

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

代码语言:javascript
复制
objc_setAssociatedObject(alertView, &fooKey, myDictionary, OBJC_ASSOCIATION_RETAIN);

在这种情况下,myDictionary将在alertView的生命周期内保留,并在释放alertView时释放。

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

代码语言:javascript
复制
NSDictionary *myDictionary = objc_getAssociatedObject(alertView, &fooKey);

如果没有设置关联,则返回nil。要打破关联,只需使用objc_setAssociatedObject为相同的对象和键关联一个新值;可以使用nil来断开关联,而不关联新对象。

除了OBJC_ASSOCIATION_RETAIN之外,here还列出了关联类型的其他值。

票数 31
EN

Stack Overflow用户

发布于 2014-01-21 00:00:51

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

代码语言:javascript
复制
+(NSString*)GetTag:(id)ObjectIn
{
    return [NSString stringWithFormat:@"Tag-%i",(int)ObjectIn];
}

在委派中:

代码语言:javascript
复制
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString* MyID = [CommandManager GetTag:alertView];
    [CurrentActiveAlerts removeObjectForKey:MyID];
}

呼叫:

代码语言:javascript
复制
    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“。希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5279884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档