8

我有一个使用 UISplitViewController 的 iPad 应用程序(左侧是 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;
}

我知道这是一个奇怪而复杂的解决方法。我不介意,但它甚至不能完全工作。如果滚动到屏幕外,选定的单元格将失去其突出显示,而已被点击的单元格在滚动到屏幕外时仍保持突出显示。

我对此完全感到困惑。我敢肯定,甚至不需要这种解决方法,因为有一个更简单的解决方案。

4

6 回答 6

11

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

该方法selectRowAtIndexPath:animated:scrollPosition:对我来说很好。它确实突出显示了选定的单元格。

于 2013-02-23T20:32:49.070 回答
3

我经历并尝试了所有这些和其他解决方案,但没有任何乐趣。在我的情况下,问题(让我发疯了 2 小时)如下 - 在我打电话后不久selectRowAtIndexPath,我打电话reloadDatatableview. 重新加载消除了所有突出显示!当心这个陷阱!随着不必要的数据调用重新加载消失,突出显示按预期发生。

于 2016-06-06T09:25:29.043 回答
2

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

override func viewDidAppear(animated: Bool)
{
    tableView.selectRowAtIndexPath(indexPathToSelectInitially, animated: false, scrollPosition: .None)
}
于 2015-03-04T08:53:17.857 回答
1

我找到了它,它对我有用(又名调用委托方法 didSelectRowAtIndexPath)

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

PS。我正在使用 UITableViewController。

于 2013-07-02T17:09:36.400 回答
0

它获取带有单元格边框的背景视图,看起来像分隔符。不要更改界面生成器中的默认表格视图设置。确保 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;
}
于 2014-12-30T09:26:33.713 回答
0

我发现使用所有已知的可能性是完全无法解决的。最后,我放弃了很多代码并改用 NSFetchedResultsController 来修复它。NSFetchedResultsController 是在我最初编写此应用程序后不久引入的,它极大地简化了将 Core Data 与 UITableViews 一起使用的过程。 https://developer.apple.com/library/IOs/documentation/CoreData/Reference/NSFetchedResultsController_Class/index.html

于 2014-11-05T13:23:31.060 回答