我在重用UITableViewCell
方面遇到了经典问题。我知道问题是什么,但我无法弄清楚我做错了什么或如何解决它。屏幕首次渲染时,一切看起来都很棒。但是当用户滚动时,相同的图像和文本以8行的集合重复显示。
在方法结束时,我打印出应该显示的文本值。这个值看起来很棒,indexPath.row值也是如此。我无法正确地重复使用这些细胞。
我没有关闭图像刷新代码,因为它有点复杂,与主要问题无关。请关注文本更新,并确保图像更新将遵循类似的模式。
我认为我正在正确设置单元格。每个子视图仅添加到cell==nil
块内。然后,我尝试更改此块之外的文本。但不知怎的,它没有得到正确的指针引用???我被卡住了。
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
MyObject *obj = [self.fetchedObjects objectAtIndex:indexPath.row];
UILabel *name;
UIImageView *imgView;
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
name = [[UILabel alloc] init];
name.frame = CGRectMake(40, 0.0, _tableView.frame.size.width-40, 44);
name.adjustsFontSizeToFitWidth = YES;
name.minimumScaleFactor = 0.5;
[cell addSubview:name];
imgView = [[UIImageView alloc] init];
imgView.frame = CGRectMake(0, 4, 36, 36);
imgView.image = [UIImage imageNamed:@"myimage.png"];
[imgView setContentMode:UIViewContentModeScaleAspectFit];
[cell addSubview:imgView];
}
// this has to be outside the `cell == nil` block, right???
name.text = obj.name;
// this output is perfect - but the actual cells are repeated!
NSLog(@"indexpath: %d", indexPath.row);
NSLog(@"name from array: %@", obj.name);
return cell;
}
答案 0 :(得分:3)
如上所述,重复使用的单元格的name
和imgView
值将为nil
。
您需要在else
语句中添加if
,才能通过访问单元格中的现有视图来设置name
和imgView
。
答案 1 :(得分:1)
//这必须在
$('#share_schedule').click(function(){ if ($('#share_url_ul').children().length >= 1){ $('#share_url_ul').empty(); } // Take care of no classes case "You cannot share an empty schedule." $.ajax({ method: "POST", url: "/share/", data: JSON.stringify(localStorage), contentType: "application/json; charset=utf-8", dataType: "text", success: function(response){ var shared_url = document.createElement('a'); $(shared_url).css('display', 'block'); $(shared_url).attr('href', window.location.href + 'shared/' + response); $(shared_url).attr('id', 'share_link'); shared_url.innerHTML = window.location.href + 'shared/' + response; $('#share_url_ul').append(shared_url); $('#fb_share_btn').attr('data-href', window.location.href + 'shared/' + response); }, error: function(error){ console.log(error); } }); });
区之外,对吧??? name.text = obj.name;
这是不正确的。当细胞不是零时,名称标签&图像视图根本没有分配。如果您坚持这样做,确实有一种方法可以解决您的问题(使用视图标记):
cell == nil
我认为你不需要创建新标签&单元格的图像视图,UILabel *name;
UIImageView *imgView;
NSInteger nameTag = 101;
NSInteger imgViewTag = 102;
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
name = [[UILabel alloc] init];
name.tag = nameTag;
...
[cell addSubview:name];
imgView = [[UIImageView alloc] init];
imgView.tag = imgViewTag;
...
[cell addSubview:imgView];
}
else {
name = (UILabel *)[cell viewWithTag:nameTag];
imgView = (UIImageView *)[cell viewWithTag:imgViewTag];
}
name.text = obj.name;
...
& imageView
可用于UITableViewCell。您可以像这样更新它们的值:
textLabel
如果你想重新发布textLabel& imageView,你可以创建一个继承自UITableViewCell的子类,并覆盖if (cell == nil) {
// ...
}
cell.textLabel.text = obj.name;
cell.imageView.image = obj.image;
:
-layoutSubviews