以编程方式突出显示UITableView单元格

时间:2013-02-23 18:28:19

标签: ios ipad uitableview uisplitviewcontroller

我有一个iPad应用程序,它使用UISplitViewController(左边是UITableView,右边是详细视图)。点击它时,我的表格视图会以蓝色突出显示所选的单元格。

当我调用以下方法时,单元格被选中但未以蓝色突出显示:

[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];

我花了很多时间花在各种委托方法和黑客上试图让单元格以编程方式突出显示,就好像它已被挖掘一样。我不能这样做。

我已经成功地实现了这个目标:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (shouldHighlightCell)
    {
        NSIndexPath *indexPathForCellToHighlight = [NSIndexPath indexPathForRow:0 inSection:0];

        if ([indexPath isEqual:indexPathForCellToHighlight])
        {
            cell.selected = YES;
            shouldHighlightCell = NO;
        }
    }
}

只要我也有这个功能,它就会起作用(否则即使在点击另一个单元格时它仍保持选中状态):

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath *ip = [NSIndexPath indexPathForRow:0 inSection:0];

    if ([[self.tableView cellForRowAtIndexPath:ip] isSelected])
    {
        [[self.tableView cellForRowAtIndexPath:ip] setSelected:NO];
    }

    NSIndexPath *iToTheP = indexPath;
    return iToTheP;
}

我知道这是一个奇怪而复杂的解决方法。我不介意,但它甚至没有完全发挥作用。如果选定的单元格在屏幕上滚动,则会丢失其突出显示,而在屏幕上滚动时,已点按的单元格仍会突出显示。

我对此感到困惑。我确信这种解决方法甚至不是必需的,有一个更简单的解决方案。

6 个答案:

答案 0 :(得分:10)

请确保单元格的selectionStyleUITableViewCellSelectionStyleBlue,并且tableView的allowsSelection设置为YES

方法selectRowAtIndexPath:animated:scrollPosition:对我来说很好。它会突出显示所选单元格。

答案 1 :(得分:2)

我还尝试了很多方法来获得在我的单选UITableView上显示的初始选择。最终对我有用的是推迟选择初始行,直到通过在我的UITableViewController的viewDidAppear中调用它来设置表:

override func viewDidAppear(animated: Bool)
{
    tableView.selectRowAtIndexPath(indexPathToSelectInitially, animated: false, scrollPosition: .None)
}

答案 2 :(得分:2)

我经历了尝试所有这些和其他解决方案而没有快乐。在我的情况下,问题(这使我疯了2小时)是以下 - 在我打电话selectRowAtIndexPath后不久,我在reloadData上呼叫tableview。重新加载正在擦除所有突出显示!小心这个陷阱!随着数据调用的不必要重新加载消失,突出显示按预期发生。

答案 3 :(得分:1)

我发现了这个并且它适用于我(也就是调用委托方法didSelectRowAtIndexPath)

NSIndexPath *defaultIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self tableView:[self tableView] didSelectRowAtIndexPath:defaultIndexPath];

PS。我正在使用UITableViewController。

答案 4 :(得分:0)

我发现使用所有已知的可能性完全无法修复。最后,我通过抛弃大量代码并切换到NSFetchedResultsController来修复它。我最初编写这个应用程序后不久就引入了NSFetchedResultsController,它极大地简化了使用UITableViews使用Core Data的过程。 https://developer.apple.com/library/IOs/documentation/CoreData/Reference/NSFetchedResultsController_Class/index.html

答案 5 :(得分:0)

它获取backgroundview的单元格边框看起来像seperator。不要更改Interface builder中的默认tableview设置。确保UITableViewCellSelectionStyleNone未设置为selectionstyle。我正在粘贴工作代码。 :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *kCellIdentifier = @"PlayListCell";
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellIdentifier];
    }
    MPMediaPlaylist *playList = [playlistCollection objectAtIndex:indexPath.row];
    cell.textLabel.text = playList.name;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
     // cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%d Songs",[playList.items count]];
    MPMediaItemCollection *playListMediaCollection = [playlistCollection objectAtIndex:indexPath.row ];

    cell.imageView.image =[UIImage imageWithCGImage:[self getImageForCollection:playListMediaCollection.items]];

    // the main code which make it highlight

    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor colorWithRed:170.0f/255.0 green:170.0f/255.0 blue:170.0f/255.0 alpha:1.0f];
    [bgColorView.layer setBorderColor:[UIColor blackColor].CGColor];
    [bgColorView.layer setBorderWidth:1.0f];
    [cell setSelectedBackgroundView:bgColorView];
    return cell;
}