UITableView 中的自定义单元格使图像在滚动时重叠

Posted

技术标签:

【中文标题】UITableView 中的自定义单元格使图像在滚动时重叠【英文标题】:Custom cell in UITableView make images overlap on scroll 【发布时间】:2014-06-18 10:13:27 【问题描述】:

我创建了自定义表格视图单元格,上面有 2 个图像(最初设置为隐藏)。 当我渲染每个单元格时,我会检查一些状态并设置图像可见/隐藏属性。 当我打开该表格时,当我滚动到底部并返回顶部时,它看起来很好,前 2-3 个单元格都显示了两个图像。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"myCustomCell";
OrderCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
        [tableView registerNib:[UINib nibWithNibName:@"myCustomCell" bundle:nil] forCellReuseIdentifier:CellIdentifier];
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
...
cell.Title.text = @"some value";
...
if(...)
cell.image1.hidden = YES;
cell.image2.hidden = NO;

else
cell.image1.hidden = NO;
cell.image2.hidden = YES;

...

为什么会发生这种情况? 问题可能出在CellIdentifier 上。 更新 第一次尝试:

OrderCustomCell *cell; 

    if(cell == nil)

        [tableView registerNib:[UINib nibWithNibName:@"myCustomCell" bundle:nil] forCellReuseIdentifier:CellIdentifier];
        cell = [tableView dequeueReusableCellWithIdentifier:nil];

    

第二次尝试:

OrderCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)

        [tableView registerNib:[UINib nibWithNibName:@"myCustomCell" bundle:nil] forCellReuseIdentifier:nil];
        cell = [tableView dequeueReusableCellWithIdentifier:nil];

    

【问题讨论】:

使用这个对你来说很好用 ***.com/questions/22862938/… 如果我将 Identifier 设置为 nil 应用程序崩溃。如果添加 for(UIView *view in... 则没有任何反应。 如果你不是我的,你能更新一下吗?,plz 只改变这个 OrderCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:nil]; 再次崩溃。 must pass a valid reuse identifier to UITableView 【参考方案1】:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 static NSString *CellIdentifier = @"myCustomCell";
OrderCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

if(cell == nil)
    [tableView registerNib:[UINib nibWithNibName:@"myCustomCell" bundle:nil] forCellReuseIdentifier:CellIdentifier];
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

...
cell.Title.text = @"some value";
 ...
if(...)
cell.image1.hidden = YES;
cell.image2.hidden = NO;

else
cell.image1.hidden = NO;
cell.image2.hidden = YES;

...

【讨论】:

滚动后仍然相同的图像重叠。【参考方案2】:

使用它作为标识符。

NSString *identifier =[NSString stringWithFormat:@"%d",indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    if (!cell) 
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    

我希望这能解决您的问题。我有同样的问题,现在解决了。

【讨论】:

崩溃不可能是因为上面的代码。崩溃还有其他原因。请更新原因。这对我来说很好。 您确定您的崩溃不是因为自定义单元格“OrderCustomCell”,因为在 NibWithNibName 中您使用的是“myCustomCell”。请仔细检查这件事。 我的自定义单元格 nib 名称是 myCustomCell 我也在 nib myCustomCell 中使用相同的标识符作为标识符我尝试更改它。【参考方案3】:

你可以使用,它对我有用。

            OrderCustomCell * orderCustomCell = (OrderCustomCell *)[tableView dequeueReusableCellWithIdentifier:nil];

            if (orderCustomCell==nil) 
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"OrderCustomCell" owner:self options:nil];
                orderCustomCell = [nib objectAtIndex:0];
            

【讨论】:

从不重叠,我敢肯定 :))

以上是关于UITableView 中的自定义单元格使图像在滚动时重叠的主要内容,如果未能解决你的问题,请参考以下文章

使用大型数据库时,如何避免 UITableView 中的自定义单元格加载时间过长

UITableview 滚动时有两个不同的自定义单元格重叠

UITableView 中的自定义单元格重叠

UITableView - 自定义 UITableViewCell 中的自定义 selectedBackgroundView 选择时隐藏单元格分隔符

UITableView 中的自定义单元格在滑动编辑后立即移动

更改单元格中的数据后,UITableView 中的自定义单元格将无法正确重新加载