我有以下问题:
我有一个带有一些文本和一些图像作为内容的UITableView。单元格的TextLabel显示文本,我添加了一个带有一些UIImageViews的UIView作为其子视图到单元格内容视图。
一切正常,直到我删除一些单元格。会发生什么,我从表中删除一个单元格(比如第一个),重新加载其数据,例如然后第二个细胞向上移动了一下但是!右边的UIView包含来自第一个(已删除)单元格的内容。
我不知道为什么会发生这种情况 - 尽管我认为在我的问题中遇到了一些错误的cellForRowAtIndexPath回调方法。
我会粘贴一些代码以使其更清晰。
我可以做的是卸载控制器并再次加载 - 然后图像再次包含正确的内容....
继承我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifierUNCHECK = @"MyIdentifierUNCHECK";
MyStuff *m = [allObjects objectAtIndex:indexPath.row];
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:MyIdentifierUNCHECK];
UIView *v;
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifierUNCHECK] autorelease];
v = [[[UIView alloc] initWithFrame:CGRectMake(5.0, 5.0, 70.0, 70.0)] autorelease];
v.contentMode = UIViewContentModeScaleAspectFill;
[v addSubview:[[UIImageView alloc] init]];//some image view
[cell.contentView addSubview:v];
}
cell.textLabel.text = m.name;
cell.textLabel.numberOfLines = 0;
cell.textLabel.font = [UIFont fontWithName:@"Helvetica-BoldOblique" size:14.0];
cell.imageView.image = [UIImage imageNamed:@"checkbox.png"];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
答案 0 :(得分:2)
我假设通过“右边的视图”你的意思是你在那里为你的单元安装...这里出现的问题是因为你重复使用单元格而不是为每个单元重置UIView,你会看到你的相同如果您有足够的单元格可以滚动它们,则会出现问题。 当您重复使用单元格时,您必须始终假设它们具有脏数据,并且应该使用正确的数据重新加载它们,在您的情况下,您的错误就在此片段中:
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifierUNCHECK] autorelease];
v = [[[UIView alloc] initWithFrame:CGRectMake(5.0, 5.0, 70.0, 70.0)] autorelease];
v.contentMode = UIViewContentModeScaleAspectFill;
[v addSubview:[[UIImageView alloc] init]];//some image view
[cell.contentView addSubview:v];
}
您只是在第一次分配时在单元格中实例化视图,所以这是发生了什么...... 1-你最初制作所有细胞并制作“正确视图” 2-您删除了一个单元格 3-对于第二个单元,系统将重新使用您创建的UITableViewCell作为第一个单元 4-由于单元格没有,UIView没有被设置,你看到的是第二个单元格的第一个单元格UIView
由于您没有重置单元格UIView,因此您在单元格中看到错误的视图而不是您期望的视图。
为了解决这个问题,您可以选择不重复使用单元格,也可以在每次调用cellForRowAtIndexPath时移动添加UIView的代码,这样右侧UIView将加载正确的单元格
答案 1 :(得分:0)
我(幸运的是:))想出来了 - 我应该从我的单元格内容中获取已经存在的视图.....并交换其内容。这就是为什么我在第一时间标记它....这帮助了我:
v = [cell.contentView viewWithTag:PRICE_TAG];
for (UIView *t in v.subviews) {
[t removeFromSuperview];
}
[v addSubview:[self setupPrice:m.price]];
应该阅读更多文档......