重用细胞… :(
我有一个9节56行的桌子。
我想为每个单元添加一个文本标签。 我创build了一个包含56个NSDictionaries
的NSArray
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一个新单元。 然后你填写你的价值观。