重用细胞… :(

我有一个9节56行的桌子。

我想为每个单元添加一个文本标签。 我创build了一个包含56个NSDictionariesNSArray menuList和一个包含每个节( menuList的行数的数组。

这里是我的代码,但它不能正常工作:

 // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //Use existing cell (reusable) UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier]; //If no existing cell, create a new one if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier] autorelease]; //Define cell accessory type cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; //Create a subView for the cell CGRect subViewFrame = cell.contentView.frame; subViewFrame.origin.x += kInset; subViewFrame.size.width = kInset + kSelectLabelWidth; UILabel *selectedLabel = [[UILabel alloc] initWithFrame:subViewFrame]; //SubView design selectedLabel.textColor = [UIColor blackColor]; selectedLabel.highlightedTextColor = [UIColor whiteColor]; selectedLabel.backgroundColor = [UIColor clearColor]; [cell.contentView addSubview:selectedLabel]; int indRow = 0; for (int i =0; i < indexPath.section; i++) { indRow += [[sectionsArray objectAtIndex:i] intValue]; } indRow += indexPath.row; NSDictionary *cellText = [menuList objectAtIndex:indRow]; selectedLabel.text = [cellText objectForKey:@"selection"]; [selectedLabel release]; } return cell; } 

这段代码有什么问题?

iOSSimulator ,当我滚动时,我发现单元格的文本有时会发生变化,标签的顺序也不正确。

所有填充你的单元格的代码都在:

 if (cell == nil) { 

语句,所以你最终创build一个小数目的单元格并填充它们(当单元格== nil时),然后返回出列的单元格。

这是应该的:

 // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //Use existing cell (reusable) UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier]; //If no existing cell, create a new one if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier] autorelease]; //Define cell accessory type cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; //Create a subView for the cell CGRect subViewFrame = cell.contentView.frame; subViewFrame.origin.x += kInset; subViewFrame.size.width = kInset + kSelectLabelWidth; UILabel *selectedLabel = [[UILabel alloc] initWithFrame:subViewFrame]; //SubView design selectedLabel.textColor = [UIColor blackColor]; selectedLabel.highlightedTextColor = [UIColor whiteColor]; selectedLabel.backgroundColor = [UIColor clearColor]; [cell.contentView addSubview:selectedLabel]; } // At this point cell whether it is a reused cell or a new one // cell points to the object we need to fill in. int indRow = 0; for (int i =0; i < indexPath.section; i++) { indRow += [[sectionsArray objectAtIndex:i] intValue]; } indRow += indexPath.row; NSDictionary *cellText = [menuList objectAtIndex:indRow]; selectedLabel.text = [cellText objectForKey:@"selection"]; [selectedLabel release]; return cell; } 

这就是代码的作用:

尝试获得一个可重用的单元格

如果没有可重用的单元格可用
 {
    创build一个新的单元格
 }

填写单元格的值

所以当一个单元格滚动屏幕时,它被放入一个重用队列。 当一个单元即将来到屏幕上你的cellForRowAtIndexPath被调用。 分配新单元比重用现有单元要慢,因此您首先尝试从重用队列中获取单元,但如果一个单元不可用,则创build一个新单元。 然后你填写你的价值观。