iOS中关联对象的简单使用objc_setAssociatedObject

本文介绍如何在 iOS 应用中使用 objc_setAssociatedObject 方法将 UITableView 的 indexPath 关联到 UIAlertView 对象上,并在对话框关闭时获取该 indexPath 的信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先看一下此方法接收的参数

objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

被关联的对象,下面举的例子中关联到了UIAlertView

要关联的对象的键值,一般设置成静态的,用于获取关联对象的值
要关联的对象的值,从接口中可以看到接收的id类型,所以能关联任何对象
关联时采用的协议,有assign,retain,copy等协议,具体可以参考官方文档
下面就以UIAlertView为例子简单介绍一下使用方法

使用场景:在UITableView中点击某一个cell,这时候弹出一个UIAlertView,然后在UIAlertView消失的时候获取此cell的信息,我们就获取cell的indexPath

第一步:
//首先看一下此方法接收的参数

objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
被关联的对象,下面举的例子中关联到了UIAlertView

要关联的对象的键值,一般设置成静态的,用于获取关联对象的值
要关联的对象的值,从接口中可以看到接收的id类型,所以能关联任何对象
关联时采用的协议,有assign,retain,copy等协议,具体可以参考官方文档
下面就以UIAlertView为例子简单介绍一下使用方法

使用场景:在UITableView中点击某一个cell,这时候弹出一个UIAlertView,然后在UIAlertView消失的时候获取此cell的信息,我们就获取cell的indexPath

第一步:
//在此我们使用到了 objc/runtime.h 所以我们需要做一个引用操作 import

static char kUITableViewIndexKey;
- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
……
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”提示”
message:@”这里是xx楼”
delegate:self
cancelButtonTitle:@”好的”
otherButtonTitles:nil];
//然后这里设定关联,此处把indexPath关联到alert上
objc_setAssociatedObject(alert, &kUITableViewIndexKey, indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[alert show];
}

第二步:

  • (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
    if (buttonIndex == 0) {
    NSIndexPath *indexPath = objc_getAssociatedObject(alertView, &kUITableViewIndexKey);
    NSLog(@”%@”, indexPath);
    }
    }
    static char kUITableViewIndexKey;
  • (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    ……
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”提示”
    message:@”这里是xx楼”
    delegate:self
    cancelButtonTitle:@”好的”
    otherButtonTitles:nil];
    //然后这里设定关联,此处把indexPath关联到alert上
    objc_setAssociatedObject(alert, &kUITableViewIndexKey, indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [alert show];
    }

第二步:

  • (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
    if (buttonIndex == 0) {
    NSIndexPath *indexPath = objc_getAssociatedObject(alertView, &kUITableViewIndexKey);
    NSLog(@”%@”, indexPath);
    }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值