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 子类中调用初始化程序吗?