我使用以下代码显示特定的UITableView:第一行必须显示一个图标,所有"内部"行不同的一行,最后还有另一个图标。所以,我们有三个图标,一个用于顶部单元格,一个用于"内部"细胞,一个用于底部细胞。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
TabBarTestAppDelegate *delegate = (TabBarTestAppDelegate *)[[UIApplication sharedApplication] delegate];
NSArray *local = delegate.myData;
// ok, it's horrible, don't look at it :-)
cell.textLabel.text = [NSString stringWithFormat:@"%@%@", @" " ,[local objectAtIndex:indexPath.row]];
//
NSString* name;
if (indexPath.row == 0) {
name = @"topicon";
}
else if (indexPath.row + 1 == [local count]) {
name = @"bottomicon";
}
else {
name = @"innericon";
}
//
UIImage *leftIcon = [[UIImage alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:name ofType:@"png"]];
//
UIImageView *imageView = [[UIImageView alloc] initWithImage:leftIcon];
[cell addSubview:imageView];
imageView.frame = CGRectMake(20,0,30,44);
[leftIcon release];
[imageView release[;
return cell;
}
会发生什么。第一次由模拟器加载UITableView时显然没有问题,但是,滚动后,它发生了一些奇怪的事情:第一个和最后一个单元格显示正确的图标AND ,在下面,另一个图标。底部和顶部图标下面的图标是"内部"图标,仅在indexPath.row!=0
或indexPath.row+1!=[local count]
时显示。坦率地说,我不知道滚动时是否所有其他图标都重复,但这种效果非常明显。
我想象子视图可能存在一些问题,但是,作为一个客观的C新手,我无法想象究竟是什么。
感谢任何帮助。
答案 0 :(得分:3)
TableView正在重复使用单元格,并且每次显示单元格时都会添加图像。
因此,当重复使用单元格时,您会添加另一个图像,但已经存在图像。
您必须重复使用图像视图,并且只在创建单元格时添加图像。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifer = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifer];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifer]autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20,0,30,44)];
imageView.tag = 1001;
[cell addSubview:imageView];
[imageView release], imageView= nil;
}
TabBarTestAppDelegate *delegate = (TabBarTestAppDelegate *)[[UIApplication sharedApplication] delegate];
NSArray *local = delegate.myData;
// ok, it's horrible, don't look at it :-)
cell.textLabel.text = [NSString stringWithFormat:@"%@%@", @" " ,[local objectAtIndex:indexPath.row]];
//
NSString* name = nil;;
if (indexPath.row == 0) {
name = @"topicon";
}
else if (indexPath.row + 1 == [local count]) {
name = @"bottomicon";
}
else {
name = @"innericon";
}
UIImageView *imageView = (UIImageView *)[cell viewWithTag:1001];
imageView.image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:name ofType:@"png"]];
return cell;
}
答案 1 :(得分:1)
一件事。不要一次又一次地添加新的图像视图。尝试重用它们。我在帖子here中给出了一个在单元格内重用组件的简单示例。
答案 2 :(得分:0)
我正在为此添加一个解决方案,因为我一直在打击这个问题一段时间,这里的大部分答案都是2 - 3年,现在有更好的方法可以解决这个问题。
在Storyboard编辑器中,您可以将多个原型单元格拖到UITableView中,并为它们提供不同的重用标识符,请执行以下操作:
if ( specialCase ) {
UIColor *color = [UIColor colorWithRed:0.2 green:(0.8) blue:0.2 alpha:1.0];
cell = [tableView dequeueReusableCellWithIdentifier:@"TopCellGreen" forIndexPath:indexPath];
cell.textColor = color;
} else {
cell = [tableView dequeueReusableCellWithIdentifier:@"TopCell" forIndexPath:indexPath];
}
请注意不同的标识符。这将阻止您的自定义(绿色文本)在[重新]使用相同单元格的其他单元格中随机显示。
答案 3 :(得分:0)
有类似的问题。我需要将一个图像添加到我的表的最后一个单元格中,indexPath.row设置为15。
所以我使用了Glenn上面显示的技巧(tnx很多!),结果是这样的:
NSString *CellIdentifier = @"Cell";
if (indexPath.row==15)
CellIdentifier=@"CamCell";
NuovaSegnalazioneCell *cell = (NuovaSegnalazioneCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil){
cell = [[NuovaSegnalazioneCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
cell.detailTextField.delegate = self;
NSLog(@"INIT CELL %d",indexPath.row);
}
这样,第15个单元格具有不同的CellIdentifier,并且在滚动表格时不会在其他任何地方重复使用。