【问题标题】:UIView is overlapping / creating again in cellForRowAtIndexPathUIView 在 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 方法。

标签: ios objective-c uitableview uiview


【解决方案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 类。但重叠仍在发生。非常意外的行为即将发生。
猜你喜欢
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多