iOS 7 - UITableView不会保持突出显示

时间:2014-03-08 06:13:21

标签: ios iphone objective-c uitableview

很抱歉,如果这是一个简单的问题,但我的代码似乎无法正常运行。我希望在用户选择后突出显示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];,但它不起作用。

有什么想法吗?谢谢。

3 个答案:

答案 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;