繁体   English   中英

objc_getAssociatedObject返回null

[英]objc_getAssociatedObject returning null

我正在尝试使用objc_setAssociatedObject传递对象

我正在尝试使用以下代码传递Evento

Evento *evento = (Evento*)[secAtt objectAtIndex:indexPath.row]; 
objc_setAssociatedObject(evento, @"evento", self, OBJC_ASSOCIATION_RETAIN);

后来我试图让这个evento用下面的代码:

Evento *evento = objc_getAssociatedObject(self, "evento");

返回nil

编辑:更多代码:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    NSString *sectionTitle = [sectionsTitles objectAtIndex:indexPath.section];
    NSArray *secAtt = [attractions objectForKey:sectionTitle];

    Evento *evento = (Evento*)[secAtt objectAtIndex:indexPath.row];
    objc_setAssociatedObject(self, @"evento", evento, OBJC_ASSOCIATION_RETAIN);

    NSString *tipoEntretenimento = evento.entretenimento.tipo.descricao;
    NSLog(@"tipo %@", tipoEntretenimento);
    UIImageView *imgCategoria = (UIImageView *)[cell.contentView viewWithTag:30];
   //[imgCategoria setContentMode:UIViewContentModeScaleAspectFit];
    if([tipoEntretenimento isEqualToString:@"Bares"])
        [imgCategoria setImage:[UIImage imageNamed:@"bares.png"]];
    else if ([tipoEntretenimento isEqualToString:@"Crianca"])
        [imgCategoria setImage:[UIImage imageNamed:@"crianca.png"]];
    else if ([tipoEntretenimento isEqualToString:@"Guloseimas"])
        [imgCategoria setImage:[UIImage imageNamed:@"guloseimas.png"]];
    else if ([tipoEntretenimento isEqualToString:@"Restaurantes"])
        [imgCategoria setImage:[UIImage imageNamed:@"restaurantes.png"]];
    else if ([tipoEntretenimento isEqualToString:@"Teatro"])
        [imgCategoria setImage:[UIImage imageNamed:@"teatro.png"]];
    else if ([tipoEntretenimento isEqualToString:@"Shows"])
        [imgCategoria setImage:[UIImage imageNamed:@"shows"]];
    else if ([tipoEntretenimento isEqualToString:@"Dança"])
        [imgCategoria setImage:[UIImage imageNamed:@"danca.png"]];
    else if ([tipoEntretenimento isEqualToString:@"Concertos"])
        [imgCategoria setImage:[UIImage imageNamed:@"concerto.png"]];
    else if ([tipoEntretenimento isEqualToString:@"Cinema"])
        [imgCategoria setImage:[UIImage imageNamed:@"cinema.png"]];


    UIFont *roboto = [UIFont fontWithName:@"Roboto-Bold" size:16];
    UILabel *lblNomeEvento = (UILabel *)[cell.contentView viewWithTag:10];
    lblNomeEvento.text = evento.entretenimento.nome;
    lblNomeEvento.font = roboto;

    Agenda *agenda = nil;
    if([evento.listaAgendas count] > 0)
        agenda = (Agenda *)[evento.listaAgendas objectAtIndex:0];

    NSLog(@"agenda %@", agenda.description);

    UIImageView *imgevento = (UIImageView *)[cell.contentView viewWithTag:20];
    [imgevento setContentMode:UIViewContentModeScaleAspectFit];
    [imgevento setImage:[UIImage imageNamed:@"pin.png"]];

    UIButton *btnCompartilhar = (UIButton *)[cell.contentView viewWithTag:40];
    [btnCompartilhar.titleLabel setHidden:YES];
    btnCompartilhar.titleLabel.text = evento.entretenimento.nome;
    [btnCompartilhar addTarget:self action:@selector(compartilharClick:) forControlEvents:UIControlEventTouchDown];


    UIButton *btnFavoritar = (UIButton *)[cell.contentView viewWithTag:50];
    [btnFavoritar addTarget:self action:@selector(favoritarClick:) forControlEvents:UIControlEventTouchDown];
    return cell;
}

后来当我尝试获取对象时:

-(void) compartilharClick:(id)sender {
    Evento *evento = (Evento *)objc_getAssociatedObject(self, "evento");

    UIActionSheet *popup = [[UIActionSheet alloc] initWithTitle:@"Compartilhar:" delegate:self cancelButtonTitle:@"Cancelar" destructiveButtonTitle:nil otherButtonTitles:
                            @"Facebook",
                            @"Google+",
                            @"Twitter",
                            @"Outros",
                            nil];
    popup.tag = 1;
    [popup showInView:[UIApplication sharedApplication].keyWindow];
}

objc_setAssociatedObject的第一个参数应为self (第三个参数应为evento

建立关联时,您会感到self evento甚至evento ,请尝试:

objc_setAssociatedObject(self, @"evento", evento, OBJC_ASSOCIATION_RETAIN);

参考链接

编辑: objc_setAssociatedObject的键(您正在使用“ evento”),需要是唯一的指针。 如果您检查参考链接,他们建议使用选择器作为键,因为它保证是唯一的。

一次定义密钥( char *const AssoicateKey = "evento"; ),它将开始起作用。

另外,除非表中只有1行,否则代码将无法工作。 每次使用单元格时,您都将覆盖关联。 检索它时,它将使最后一个单元格的对象出队。 您可以将对象与按钮相关联,并将其从发送者处移出,以使其生效。

这里的问题可能是因为当函数需要const void *key时,您使用NSString作为const void *key

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

尝试添加static char *EventToKey = "EventToKey"; 高于您的实现。

然后将objc_getAssociatedObjectobjc_setAssociatedObject使用更改为

objc_setAssociatedObject(self, EventToKey, evento, OBJC_ASSOCIATION_RETAIN);

objc_getAssociatedObject(self, EventToKey);

您使用的密钥在两个调用中必须是相同的指针。 不是一个具有相同值的字符串(如果您两次传递“ evento”,则指针可能会不同),并且与您所做的一样,最确定的是一个NSString * @“ evento”和一个C字符串“ evento”。

最简单的方法是创建一个静态变量并传递地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM