在我的表格视图中,单元格大小适合整个屏幕大小。所以它只创建了两个单元格,但是从第三个单元格创建它使用旧单元格的内容...所以我得到的数据不正确..
如何解决这个问题......?
感谢。
- (UITableViewCell *)tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
cell = [[[UITableViewCell alloc] initWithFrame:CellFrame reuseIdentifier:CellIdentifier] autorelease];
for(UIView *v in [cell.contentView subviews])
[v removeFromSuperview];
curCellNo = indexPath.row;
if(curCellNo == 0){
min = 0;
max = 8;
x=0;
y=yForFirst;
col = 1;
}else{
if(curCellNo < prevCellNo){
min = min-12;
max = max-12;
}else{
min = max;
max = min+12;
}
x=0;
y=0;
}
prevCellNo = curCellNo;
NSLog(@"Max...%d",max);
NSLog(@"Min...%d",min);
NSLog(@"songsCount...%d",[songs count]);
for(int i=min; i<max && i<[songs count]; i++){
Song *thesong = [self.songs objectAtIndex:i];
CGRect frame;
frame.size.width=coverWidth; frame.size.height=coverHeight;
frame.origin.x=x; frame.origin.y=y;
LazyImageView* asyncImage = [[[LazyImageView alloc] initWithFrame:frame]autorelease];
NSURL* url = [NSURL URLWithString:thesong.cover];
[asyncImage loadImageFromURL:url];
UILabel *label = [[[UILabel alloc]initWithFrame:CGRectMake(x, y+artistLabelYPos, artistLabelWidth, artistLabelHeight)]autorelease];
label.text = [thesong.title stringByAppendingString:[@"\nby " stringByAppendingString:thesong.artist]];
[label setTextAlignment:UITextAlignmentLeft];
label.numberOfLines = 0;
label.font = [UIFont systemFontOfSize:artistLabelFontSize];
label.textColor = [UIColor whiteColor];
label.backgroundColor = [UIColor darkTextColor];
label.alpha = 0.75;
UIButton *playBtn = [UIButton buttonWithType:UIButtonTypeCustom];
playBtn.frame = CGRectMake(x+playBtnXPos, y+playBtnYPos, playBtnWidth, playBtnHeight);
[playBtn addTarget:self action:@selector(playBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
if(playingButton && streamer){
if(playingButtonTag == i && [streamer isPlaying]){
[playBtn setBackgroundImage:[UIImage imageNamed:pauseBtnimgName] forState:UIControlStateNormal];
playingButton = playBtn;
}else [playBtn setBackgroundImage:[UIImage imageNamed:playBtnimgName] forState:UIControlStateNormal];
}else [playBtn setBackgroundImage:[UIImage imageNamed:playBtnimgName] forState:UIControlStateNormal];
playBtn.tag = i;
[cell.contentView addSubview:asyncImage];
[cell.contentView addSubview:label];
[cell.contentView addSubview:playBtn];
label = nil;
asyncImage = nil;
if(curCellNo == 0){
y += estCoverHeight;
if(y>=(estCoverHeight*noOfRowsInCell)){
col++;
x += estCoverWidth;
if(col>=3)
y=0;
else
y=yForFirst;
}
}else{
col =3;
y += estCoverHeight;
if(y>=(estCoverHeight*noOfRowsInCell)){
x += estCoverWidth;
y=0;
}
}
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.contentView.transform = CGAffineTransformMakeRotation(M_PI/2);
return cell;
}
答案 0 :(得分:2)
这是因为你永远不会设置重复使用的UITableViewCell的内容
您只在(cell == nil)和分配新单元格时提供conetent
答案 1 :(得分:1)
重复使用时,您不会清除单元格的内容。这是UITableView编程101.请在iTunesU上有WWDC视频,Stanford视频,如果您愿意,还可以使用文本中的tableview编程指南,这些都是关于单元重用的。
简而言之:细胞被重复使用以节省内存。您可以在离开屏幕时重复使用旧单元格,如果没有可以重复使用则分配新单元格。如果您重复使用旧单元格,则必须先清除放在它们上的所有子视图。
另外,您可能需要一个自定义单元格来执行您在tableView:cellForRowAtIndexPath:
中所做的大部分工作。我强烈建议您同时查看它。
答案 2 :(得分:1)
我犯了一些错误 - 一旦你完成它并修复它,你永远不会忘记:)
出于性能原因,缓存了UITableViewCell的实例。 UITableView类为您处理这一切。它基本上缓存了足够的实例来覆盖整个屏幕的细胞和一些细胞。这意味着具有100行的表将使用与具有1000行的表相同数量的实例。
这意味着您有责任在内容出现时更新内容。
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath在请求单元格时被调用。在您的实施中:
if(cell == nil) {
// Instantiate the UITableViewCell here
// Perform operations that need to occur on every cell, regardless of content
}
// Out here, perform content assignments
希望清除一些东西。你基本上只需要将条件内部的大部分代码转移到条件之外。那就是说,我不会宽恕你对代码的使用。你真的应该实现一个自定义单元格。它比你正在做的更容易:)
答案 3 :(得分:0)
试试这个
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
它对我有用。我有一个带有组合单元格的UITableView。我也遇到了同样的问题。