iOS 7 - 单击时正确选择/取消选择行

时间:2014-03-09 03:49:37

标签: ios objective-c

抱歉,但我一直困扰着这个棘手的问题。我有一个tableView,一旦用户点击它,就会出现一个复选标记,并突出显示。但是,当用户再次单击它时,只有复选标记消失并且突出显示仍然存在。在第三次点击时,复选标记消失但我得到了突出显示。在第四次单击时,tableViewCell最终被清除。我怀疑这与我的didSelectRowAtIndexPath方法有关。

这是我的cellForRowAtIndexPath方法。 我在这里基本上做的是,如果需要,我设置下一个标签和复选标记。

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

    static NSString *ItemCellIdentifier = @"CellIdentifier";
    SearchResultTableViewCell *tableCell =(SearchResultTableViewCell *)[tableView dequeueReusableCellWithIdentifier:ItemCellIdentifier];

    //set text labels here
    [tableCell.price setText:[NSString stringWithString:[priceList objectAtIndex:indexPath.row]]];
    [tableCell.itemName setText:[NSString stringWithString:[itemNameList objectAtIndex:indexPath.row]]];

    //set check mark and highlights.
    if ([[checkList objectAtIndex:indexPath.row] integerValue] == 1){
        tableCell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

    else{
        tableCell.accessoryType = UITableViewCellAccessoryNone;
    }

    return tableCell;

}

这是我的didSelectRowAtIndexPath方法。在这种方法中,我通过将checkMark值切换为0(如果它为1)来切换为0,反之亦然,因此当调用[self.searchResults reloadData];时,它会知道哪些行需要复选标记,哪些行不需要。我还将所选单元格设置为选中或不选,因为我保存了所选行的索引路径,所以当我重新加载表格时,我知道哪些是被选中的,我可以突出显示它。

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

    if ([[checkList objectAtIndex:indexPath.row] integerValue] == 1){
        [checkList replaceObjectAtIndex:indexPath.row withObject:@"0"];
        [[tableView cellForRowAtIndexPath:indexPath] setSelected:NO];
    }
    else{
        [checkList replaceObjectAtIndex:indexPath.row withObject:@"1"];
        [[tableView cellForRowAtIndexPath:indexPath] setSelected:YES];
    }

    NSArray *indexPaths = [self.searchResults indexPathsForSelectedRows];

    //searchResults is my tableView
    [self.searchResults reloadData];

    for (NSIndexPath *indexPath in indexPaths) {
        [self.searchResults selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    }

}

我感觉我在做[[tableView cellForRowAtIndexPath:indexPath] setSelected:NO];错了。如何从tableView对象正确访问tableViewCell,如何将其正确设置为选中或不?

提前致谢

2 个答案:

答案 0 :(得分:1)

-didSelectRowAtIndexPath:中,请务必致电[tableView deselectRowAtIndexPath:indexPath animated:YES]

根据需要更改传递给animated的值。

注意到,我不会在selected中手动设置-didSelectRowAtIndexPath:。我只在单元格的配置中设置单元格selected。请致电setSelected:,看看它是否有效。

答案 1 :(得分:0)

我认为

      [self.searchResults reloadData];

可能导致重新加载表格,然后独立确定是否选择了单元格。我一直使用这个命令,尤其是当底层数组或数据发生变化时,它可能对选择行时你正在做的事情很重要。在这种情况下,你想要这样做:

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



   NSArray *indexPaths = [self.searchResults indexPathsForSelectedRows];

   //searchResults is my tableView
  [self.searchResults reloadData];

  for (NSIndexPath *indexPath in indexPaths) {
      [self.searchResults selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
}
if ([[checkList objectAtIndex:indexPath.row] integerValue] == 1){
      [checkList replaceObjectAtIndex:indexPath.row withObject:@"0"];
       [[tableView cellForRowAtIndexPath:indexPath] setSelected:NO];
   }
  else{
       [checkList replaceObjectAtIndex:indexPath.row withObject:@"1"];
       [[tableView cellForRowAtIndexPath:indexPath] setSelected:YES];
  }

}