抱歉,但我一直困扰着这个棘手的问题。我有一个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,如何将其正确设置为选中或不?
提前致谢
答案 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];
}
}