UITableViewCell在大型UITableView(Xcode,iOS)中不可见时为零

时间:2015-09-26 16:17:36

标签: ios objective-c uitableview accessorytype

我制作了一个大的UITableView,其中包含27个静态UITableViewCell s。选择UITableViewCell时,应将其accessoryType设置为UITableViewAccessoryCheckmark,将最后选择的UITableViewCell accessoryType设置为UITableViewAccessoryNone

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];

  // get an NSInteger from NSUserDefaults

  [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:savedInteger inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];
  [self tableView:self.tableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:savedInteger inSection:0]];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  // get the NSInteger again

  UITableViewCell *lastCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:savedInteger inSection:0]];
  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

  lastCell.accessoryType = UITableViewAccessoryNone;
  cell.accessoryType = UITableViewAccessoryCheckmark;

  // save indexPath.row in NSUserDefaults and do some other stuff

如果您选择的UITableViewCell靠近上次选择的UITableViewCell,但最后选择的UITableViewCell约为11行左右,那么{{1} }是UITableViewCell *lastCell,复选标记不会消失。

为什么它会像那样,我该如何解决?提前谢谢。

2 个答案:

答案 0 :(得分:0)

cellForRowAtIndexPath只返回可见单元格,因为UITableView会重复使用单元格(当您从顶部滚动单元格时,它只初始化几个单元格,依此类推,这样有效)

查看类似问题here

答案 1 :(得分:0)

如果单元格不可见或索引路径超出范围,

cellForRowAtIndexPath 将返回 nil
因此,请检查当前选定的单元格是否可见。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // get the NSInteger from NSUserDefaults
    NSIndexPath *previousSelection = [NSIndexPath indexPathForRow:savedInteger inSection:0];
    if ([tableView.indexPathsForVisibleRows containsObject:previousSelection]) {
        UITableViewCell *lastCell = [tableView cellForRowAtIndexPath:previousSelection];
        lastCell.accessoryType = UITableViewAccessoryNone;
    }

    // save indexPath.row in NSUserDefaults

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewAccessoryCheckmark;

    // do other stuff
}

此外,为了确保首先使用所需的 accessoryType 创建表格视图单元格,请在 accessoryType >的cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // get the table view cell and set the details

    cell.accessoryType = UITableViewAccessoryNone;

    // get the NSInteger from NSUserDefaults
    if (indexPath.row == savedInteger) {
        cell.accessoryType = UITableViewAccessoryCheckmark; 
    }

    return cell;
}