Iphone:滚动时,UITableview中的复选标记会混淆
我有一个问题,我的复选标记,我适用于我的行在我的UITableView得到所有混淆,当我滚动。 我敢肯定,这与iPhone如何重用单元格有关,当我滚动离开,有一个复选标记,它可能会把它放回当我有机会。
有人能给我一些提示,告诉我如何避免这种情况,或者可能看看我的方法,看看是否有什么关系?
我在想,也许我可以保存用户所做的每一行select,然后检查显示哪些行,以确保正确的行得到复选标记,但我不能看到这样做的方式。
非常感谢。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; [cell setAccessoryView:nil]; } NSMutableArray *temp = [[NSMutableArray alloc]init]; for (int j = 0; j < [listOfRowersAtPractice count]; j++) { if ([[differentTeams objectAtIndex:indexPath.section] isEqualToString:[[rowersAndInfo objectForKey:[listOfRowersAtPractice objectAtIndex:j]]objectForKey:@"Team"]]) { [temp addObject:[listOfRowersAtPractice objectAtIndex:j]]; } } [cell.cellText setText:[temp objectAtIndex:indexPath.row]]; [temp removeAllObjects]; [temp release]; // Set up the cell... return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if (cell.accessoryType != UITableViewCellAccessoryCheckmark) { cell.accessoryType = UITableViewCellAccessoryCheckmark; }else { cell.accessoryType = UITableViewCellAccessoryNone; } }
是在将单元格重置为默认状态并检查行状态并更改状态之后,保存所选行和cellforrowatindexpath中的行的状态。
编辑:
你可以创build一个NSMutabaleArray,其中的条目数等于你的代码中的数据源中的项目数。
在select你实际上可以改变在这个指数的值,像上面创build的数组中的@“selected”一些文本。
在您的cellforrowatindexpath中,您可以选中或取消选中该文本,然后更改单元格的属性。 就像维护一个位图状态的select和未select状态。
给这个去吧:
static NSString *CellIdentifier = [NSString stringWithFormat:@"Cell %d",indexPath.row];
我的应用程序中有一个同样的问题。
至于检查标记,你是否使用核心数据存储?
如果您使用以下….
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { NSManagedObject *item = [[self fetchedResultsController] objectAtIndexPath:indexPath]; if ([[item valueForKey:@"checks"] boolValue]) { cell.accessoryType = UITableViewCellAccessoryCheckmark; [cell.textLabel setTextColor:[UIColor redColor]]; [cell.detailTextLabel setTextColor:[UIColor redColor]]; } else { cell.accessoryType = UITableViewCellAccessoryNone; [cell.textLabel setTextColor:[UIColor blackColor]]; [cell.detailTextLabel setTextColor:[UIColor blackColor]]; } }
和……
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSManagedObject *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; if ([[selectedObject valueForKey:@"checks"] boolValue]) { [selectedObject setValue:[NSNumber numberWithBool:NO] forKey:@"checks"]; } else { [selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"checks"]; } [managedObjectContext save:nil]; }
每当重复使用单元格时,都需要重置/清除单元格中的所有设置。 所以在这里,当你拿到手机后,
你需要做类似的事情
CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; [cell setAccessoryView:nil]; } cell.accessoryType = UITableViewCellAccessoryNone // This and other such calls to clean up the cell
您需要刷新单元格的accessoryType,因为单元格被重用,所以它inheritance了重用单元格的accessoryType,这是解决scheme:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"cellIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; //Refresh acessory for cell when tableview have many cells and reuse identifier if([self.tableView.indexPathsForSelectedRows containsObject:indexPath]){ cell.accessoryType = UITableViewCellAccessoryCheckmark; }else{ cell.accessoryType = UITableViewCellAccessoryNone; } cell.textLabel.text = @"Your text cell"; return cell; }
它为我工作..在索引path中的单元格我已经创build了一个checkboxbutton..后everytym tableview滚动cellForRowAtIndexPath方法被调用,因此我不得不在cellForRowAtIndexPath添加条件,以检查单元格是否有一个检查或未经检查的button
static NSString *simpleTableIdentifier = @"SimpleTableCell"; SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil]; cell = [nib objectAtIndex:0]; } cell.nameLabel.text = [tableData objectAtIndex:indexPath.row]; cell.thumbnailImageView.image = [UIImage imageNamed:[thumbnails objectAtIndex:indexPath.row]]; cell.prepTimeLabel.text = [prepTime objectAtIndex:indexPath.row]; checkbox = [[UIButton alloc]initWithFrame:CGRectMake(290, 5, 20, 20)]; [checkbox setBackgroundImage:[UIImage imageNamed:@"checkbox_empty.png"] forState:UIControlStateNormal]; [checkbox addTarget:self action:@selector(checkUncheck:) forControlEvents:UIControlEventTouchUpInside]; [cell addSubview:checkbox]; if(selectedRows.count !=0) { if([[selectedRows objectAtIndex:indexPath.row]integerValue]==1) { [checkbox setImage:[UIImage imageNamed: @"checkbox_full.png"] forState:UIControlStateNormal]; } else { [checkbox setImage:[UIImage imageNamed: @"checkbox_empty.png"] forState:UIControlStateNormal]; } } return cell; }
方法来定义checkbox的select是
- (IBAction)checkUncheck:(id)sender { UIButton *tappedButton = (UIButton*)sender; NSLog(@"%d",tappedButton.tag); if ([[sender superview] isKindOfClass:[UITableViewCell class]]) { UITableViewCell *containerCell = (UITableViewCell *)[sender superview]; NSIndexPath *cellIndexPath = [self.tableView indexPathForCell:containerCell]; int cellIndex = cellIndexPath.row; NSLog(@"cell index%d",cellIndex); [selectedRows insertObject:[NSNumber numberWithInt:1] atIndex:cellIndex]; } NSLog(@"%@",selectedRows); if([tappedButton.currentImage isEqual:[UIImage imageNamed:@"checkbox_empty.png"]]) { [sender setImage:[UIImage imageNamed: @"checkbox_full.png"] forState:UIControlStateNormal]; } else { [sender setImage:[UIImage imageNamed: @"checkbox_empty.png"] forState:UIControlStateNormal]; } }
不要忘记初始化selectedRows数组..开心编码… !!!
- 在X轴coreplot上使用Epoch时间
- IOS unregisterForRemoteNotifications在飞行模式下不起作用
- + entityForName:在此模型中找不到名为“狗”的实体。
- 如何在iOS Swift中将点更改为密码字段中的另一个字符
- 未调用iOS 10 UNUserNotificationCenterDelegate。 推送通知无效
- iOS中的无线配件configuration:EAWiFiUnconfiguredAccessoryBrowser只会检测一次未configuration的配件
- UINavigationBar背景颜色不是我设置的确切的UIColor
- Xcode中的iOS 9警告 – 此文件设置为构build比项目部署早的版本。 function可能受到限制
- 如何正确地将HTTP响应中的Last-Modified标头转换为iOS上的NSDate