尝试通过 viewWithTag 获取 UIImageView 引用后崩溃

Posted

技术标签:

【中文标题】尝试通过 viewWithTag 获取 UIImageView 引用后崩溃【英文标题】:Crash after attempting to get a UIImageView reference through viewWithTag 【发布时间】:2011-05-12 19:24:02 【问题描述】:

我需要在表格单元格中绘制图像。到目前为止,在创建视图并将其分配给单元格后,我还无法获得对 UIImageView 的正确引用。例如,同样的过程也适用于 UILabel。

我不知道我做错了什么。

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"Cell";

    UIImageView *imageView;
    UILabel *title;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                       reuseIdentifier:CellIdentifier] autorelease];

        // Setup title
        title = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)] autorelease];
        title.tag = 1;
        [cell.contentView addSubview:title];

        // Setup image
        UIImageView* imageView = [[[ UIImageView alloc] initWithFrame: 
                                   CGRectMake(50, 0, 50, 50)] autorelease];
        imageView.tag = 2;
        [cell.contentView addSubview:imageView];

     else 
        // Get references to cell views
        title = (UILabel *)[cell.contentView viewWithTag:1];
        imageView = (UIImageView *)[cell.contentView viewWithTag:2];
    

    NSLog(@"%@", [title class]);     // UILabel
    NSLog(@"%@", [imageView class]); // CRASH! EXC_BAD_ACCESS

    return cell;

【问题讨论】:

【参考方案1】:

问题在于imageView 变量的范围。如果单元格尚不存在,则创建一个仅存在于 if 块中的新 UIImageView。它隐藏了您之前声明的变量,并在 if 块结束后消失。 而不是

UIImageView *imageView = ...

你应该简单地写

imageView = ...

否则,您将创建一个与您在方法顶部声明的对象无关的新对象,并且原始 imageView 仍未定义。

【讨论】:

非常感谢!我对 Objective-C 的作用域和内部工作原理还有些模糊。

以上是关于尝试通过 viewWithTag 获取 UIImageView 引用后崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为啥 tableview rowAtindexpath 中的 viewWithTag 总是为零?

viewWithTag 和 addSubview

uiview 容器 - viewwithtag 有时返回 null

为啥将“viewWithTag”与“dequeueReusableCellWithIdentifier”一起使用?

Swift:通过 ID 获取 UI 对象?

关于viewWithTag的一点说明