UIView 在 cellForRowAtIndexPath 中重叠/再次创建

Posted

技术标签:

【中文标题】UIView 在 cellForRowAtIndexPath 中重叠/再次创建【英文标题】:UIView is overlapping / creating again in cellForRowAtIndexPath 【发布时间】:2016-06-03 12:48:11 【问题描述】:

我有UITableViewCell,其中包含UIView(我们称之为CPView),它是在调用cellForRowAtIndexPath 时创建的。 CPView 只是一个纯色视图,每个单元格的宽度都不同(这就是为什么需要在 cellForRowAtIndexPath 中创建)。

问题是

1)CPView 的颜色在每次加载单元格时都会变深(可能是由于每次该单元格创建相同的视图时会产生重叠效果)。

2) 单元格重叠/继承其他单元格的CPView(我们可以看到这是因为两个CPView 的浅色和深色)。

如果单元格已经存在或再次创建此CPView,我如何防止它重新创建?

编辑

- (void)configureCell:(CreditDebitCell *)cell atIndexPath:(NSIndexPath *)indexPath 

    //other code 

      UIView * CPView;

            if (CPView)

                CPView =nil;
            
        else
        

        CPView = [[UIView alloc] initWithFrame:CGRectMake(cell.bounds.origin.x, cell.bounds.origin.y, cell.frame.size.width*[self.percentArray[indexPath.row] floatValue] ,cell.frame.size.height )];
        [CPView setClipsToBounds:YES];
        [CPView setBackgroundColor:[UIColor colorWithRed:107/255.0 green:15/255.0 blue:47/255.0 alpha:0.5]];

        [cell addSubview: CPView];

      


【问题讨论】:

写出有问题的 cellforRowAtIndexPath 没错。如果没有看到您的 cellForRowAtIndexPath 函数,就无法提出修复建议。 (我认为您错过了对 dequeueReusableCellWithIdentifier 的调用。) @MikeGledhill 我在 cellForRowAtIndexPath 中编写了 dequeueReusableCellWithIdentifier 方法。 【参考方案1】:

这里的问题是单元格的重用 - 因此您会在单元格视图中添加多个视图。

你可以:

-删除子视图 -检查子视图是否存在并做/不做任何事情。

您可以通过子视图检查子视图是否存在:

for (UIView *v in cell.contentView.subview) 
    if ([v isKindOfClass:[CPView class]]) 
        // remove or flag that it exists
    

但我认为你应该在你的单元格中处理这个 - 而不是你实现表视图委托的视图控制器。最好告诉单元格根据某种逻辑使用某些视图/隐藏某些视图,然后在 cellForRowAtIndexPath

中执行此操作

【讨论】:

更改逻辑后,单元格现在只能创建一次视图。谢谢@nick。【参考方案2】:

根据您的question(without cellforRowAtIndexpath),我可以假设您应该每次都检查cellForRowAtIndexPath中的内容

  if(cpView)

       cpView = nil;
  

  // alloc again with required size for particular row.

【讨论】:

我在 cellForRowAtIndexPath 中创建 CPView 所以每次它都为零。【参考方案3】:

创建您的UITableViewCell 的子类,并为其创建一个引用您的CPView 的属性。现在,您可以更好地控制您的子类单元格是否有/没有任何需要添加的CPView

【讨论】:

我尝试在 IB 中添加 CPView 。但它的框架在 cellForRowAtIndexPath 中没有改变。如果cellForRowAtIndexPath 中的宽度可以更改,则不会出现此问题。我还尝试更改 viewDidLayoutSubview 中的框架。但没有任何反映。 我没有在 IB 中提到你的 CPView。我说过你应该创建一个UITableViewCell 的子类,然后你将在其上声明为你的 IB 或故事板中的单元格的类。 这是 NickCatib 所说的确切答案 - 在您的牢房内处理它。您接受的答案是正确的,但这是在您的单元格内标记CPViiew 存在的更好方法,而不是循环遍历其所有子视图。 我已经尝试过将视图也引用到 uitableviewcell 类。但重叠仍在发生。非常意外的行为即将发生。

以上是关于UIView 在 cellForRowAtIndexPath 中重叠/再次创建的主要内容,如果未能解决你的问题,请参考以下文章

图像下载后调整表格单元格大小

在 uibutton 的单击上动态重新创建 uitableview 部分

tableView(cellForRowAtIndexPath) 与 tableView.cellForRowAtIndexPath()?

设置静态表格视图单元格的复选标记

dequeueReusableCellWithIdentifier: 在我的 UITableViewCell 子类中调用初始化程序吗?

以编程方式更改表格单元格中按钮的图像