我创建的自定义单元格包含UILabel
,UIImageView
,使用UILabel
的常量标记,UIImageView
使用动态标记,表格有11个单元格,前7个单元格正确加载时,8,9,10,11单元格图像视图在我分别更改表格中的1,2,3,4单元时更改,单元格中的标签也相同,我正在使用图像进行检查表格中的框,UITapGestureRecognizer
用于更改表格中的图像视图,
我正在使用此代码.....
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier =@"Cell";
UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
cell.selectionStyle=UITableViewCellSelectionStyleGray;
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
UIImageView *imageview=[[UIImageView alloc]initWithFrame:CGRectMake(5, 12, 20, 20)];
imageview.tag=n;
[cell.contentView addSubview:imageview];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tabimage:)];
imageview.userInteractionEnabled=YES;
[imageview addGestureRecognizer:tap];
imageview.image=[UIImage imageNamed:@"img1.jpeg"];
UILabel *titleLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 2, 260,26)];
titleLabel.tag=222;
titleLabel.backgroundColor=[UIColor clearColor];
[cell.contentView addSubview:titleLabel];
UILabel *dateLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 31, 260, 13)];
dateLabel.tag=333;
dateLabel.font=[UIFont systemFontOfSize:10];
dateLabel.backgroundColor=[UIColor clearColor];
[cell.contentView addSubview:dateLabel];
}
UIImageView *imageview1=(UIImageView*)[cell.contentView viewWithTag:n];
if([array containsObject:[NSNumber numberWithInt:imageview1.tag]]) {
imageview1.image=[UIImage imageNamed:@"img2.jpeg"];
} else {
imageview1.image=[UIImage imageNamed:@"img1.jpeg"];
}
UILabel *titlelable=(UILabel*)[cell.contentView viewWithTag:222];
titlelable.text=[task objectAtIndex:indexPath.section];
NSLog(@"%i",indexPath.section);
UILabel *dateLabel=(UILabel*)[cell.contentView viewWithTag:333];
dateLabel.text=[date objectAtIndex:indexPath.section];
n++;
return cell;
}
- (void)tabimage:(id)sender {
UIImageView *iv=(UIImageView *)[sender view];
int i=iv.tag;
NSLog(@"------------%i",i);
if (iv.image==[UIImage imageNamed:@"img1.jpeg"]) {
iv.image= [UIImage imageNamed:@"img2.jpeg"];
[array addObject:[NSNumber numberWithInt:i]];
} else {
iv.image= [UIImage imageNamed:@"img1.jpeg"];
[array removeObject:[NSNumber numberWithInt:i]];
}
}
答案 0 :(得分:8)
您应该将您的单元格标识符从静态更改为动态,以解决您的问题。
你应该替换这个
static NSString *CellIdentifier =@"Cell";
UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier];
用这个
UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%d %d"], indexPath.row, indexPath.section];
答案 1 :(得分:4)
无论你看到什么问题,使用“n
”很可能就是问题所在。没有充分的理由使用共享变量来标记(和检索)表视图单元格上的视图。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
被多次调用,对于同一个单元格可能会多次调用,有时会找到要重用的单元格,有时则不会。“/ p>
我当然不知道n
是什么,以及你如何在代码中的其他地方使用它,但是你在这里调用每次调用都会改变它,并且当调用这个方法时你无法做出假设,所以它毫无价值。
您肯定知道每个单元格都有一个带有该标记的图像,但是如果它在第一次运行此方法之后永远不可访问是完全未定义的,那么每次重复使用时,您基本上都会获得随机行为(或者是新鲜的)新单元格或带有您不知道标签的重复单元格。
问问自己(或者在另一个问题上可能是SO):你想在这里完成什么?
答案 2 :(得分:2)
我正在为我的应用程序获取解决方案,
在我的代码中使用动态单元格标识符
NSString *CellIdentifier =[NSString stringWithFormat:@"%i-%i", indexPath.section,indexPath.row];
答案 3 :(得分:1)
我建议UITableViewCell的子类添加所有自定义元素,为它创建setter。在cellForRowAtIndexPath中只需调用你的setter。
答案 4 :(得分:0)
当您在if(cell == nil)中将标签设置为imageview时,意味着在创建单元格时将设置标记。在您的情况下,在通过出列重用单元格之后,将创建7个单元格。因此,对于8个以上,将使用先前创建的单元格。这就是为什么你的标签与1,2,3 ...相同的8,9,10 ...单元格。
嗯,Alex建议采用标准方式。但是如果你还没有使用自定义单元格,你可以试试这个 -
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier =@"Cell";
UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier];
UIImageView *imageview = nil;
if(cell){
for (UIView *view in cell.contentView.subviews){
if([view isKindOfClass:[UIImageView class]]){
imageview = (UIImageView*)view;
break;
}
}
}
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
cell.selectionStyle=UITableViewCellSelectionStyleGray;
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
imageview=[[UIImageView alloc]initWithFrame:CGRectMake(5, 12, 20, 20)];
[cell.contentView addSubview:imageview];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tabimage:)];
imageview.userInteractionEnabled=YES;
[imageview addGestureRecognizer:tap];
imageview.image=[UIImage imageNamed:@"img1.jpeg"];
UILabel *titleLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 2, 260,26)];
titleLabel.tag=222;
titleLabel.backgroundColor=[UIColor clearColor];
[cell.contentView addSubview:titleLabel];
UILabel *dateLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 31, 260, 13)];
dateLabel.tag=333;
dateLabel.font=[UIFont systemFontOfSize:10];
dateLabel.backgroundColor=[UIColor clearColor];
[cell.contentView addSubview:dateLabel];
}
imageview.tag=n;
if([array containsObject:[NSNumber numberWithInt:imageview.tag]]) {
imageview.image=[UIImage imageNamed:@"img2.jpeg"];
} else {
imageview.image=[UIImage imageNamed:@"img1.jpeg"];
}
UILabel *titlelable=(UILabel*)[cell.contentView viewWithTag:222];
titlelable.text=[task objectAtIndex:indexPath.section];
NSLog(@"%i",indexPath.section);
UILabel *dateLabel=(UILabel*)[cell.contentView viewWithTag:333];
dateLabel.text=[date objectAtIndex:indexPath.section];
n++;
return cell;
}