很抱歉,如果这是一个简单的问题,但我的代码似乎无法正常运行。我希望在用户选择后突出显示tableView中的选定行。
我有2个数组,我从中获取价格和物品名称。我有一个第三个数组跟踪选择了哪一行,所以我知道已经选择了哪一行。
这是我的cellForRowAtIndexPath
方法,我在其中指定文本标签和复选标记。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ItemCellIdentifier = @"CellIdentifier";
//SearchresultTableViewCell is my own class for the tableViewCell
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;
[tableCell setHighlighted:YES];
}
else{
tableCell.accessoryType = UITableViewCellAccessoryNone;
[tableCell setHighlighted:NO];
}
return tableCell;
}
这是他didSelectRowAtIndexPath
方法。我在这里基本上做的是通过编辑我的checkList
数组来标记对象。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"did select row at index path entered");
if ([[checkList objectAtIndex:indexPath.row] integerValue] == 1){
[checkList replaceObjectAtIndex:indexPath.row withObject:@"0"];
}
else{
[checkList replaceObjectAtIndex:indexPath.row withObject:@"1"];
}
[self.searchResults reloadData];
}
我尝试了[tableCell setHighlighted:TRUE];
和[tableCell setHighlighted:1];
,但它不起作用。
有什么想法吗?谢谢。
答案 0 :(得分:3)
我想您需要致电setSelected:
而非setHighlighted
,请尝试将[tableCell setHighlighted:YES];
替换为[tableCell setSelected:YES];
此外,我注意到只是简单地调用[tableCell setSelected:YES];
并不总是选择该行,因此如果setSelected
仍然不起作用,请尝试使用以下内容替换[tableCell setHighlighted:YES];
:
[tableView selectRowAtIndexPath:indexPath
animated:YES
scrollPosition:UITableViewScrollPositionNone];
您可以注释掉[tableCell setHighlighted:NO];
,因为当您重新加载表格时,它会自动被取消选中。
这就是你的代码的样子:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ItemCellIdentifier = @"CellIdentifier";
//SearchresultTableViewCell is my own class for the tableViewCell
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;
// [tableCell setHighlighted:YES];
[tableView selectRowAtIndexPath:indexPath
animated:YES
scrollPosition:UITableViewScrollPositionNone];
}
else{
tableCell.accessoryType = UITableViewCellAccessoryNone;
// [tableCell setHighlighted:NO];
}
return tableCell;
}
答案 1 :(得分:3)
感谢您回答我的评论。正如我所提到的,发送reloadData
消息将导致取消选择当前选定的单元格。因此,您应该在重新加载tableView之前缓存当前选定的单元格,然后再恢复它们。我在想这样的事情:
NSArray *indexPaths = [self.searchResults indexPathsForSelectedRows];
[self.searchResults reloadData];
for (NSIndexPath *indexPath in indexPaths) {
[self.searchResults selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
}
只要您没有插入/删除/移动行,这应该可以正常工作。如果你是,你将不得不考虑到这一点。
答案 2 :(得分:1)
如果您想同时选择多个单元格,则应考虑设置tableView.allowsMultipleSelection = YES;