【问题标题】:Losing selection highlight in NSOutlineView subclass在 NSOutlineView 子类中丢失选择突出显示
【发布时间】:2012-03-06 18:12:17
【问题描述】:

为了自定义默认的蓝色渐变高亮样式,我创建了NSOutlineView子类,并覆盖了-highlightSelectionInClipRect 方法,如下所示:

- (void)highlightSelectionInClipRect:(NSRect)theClipRect
{
    NSRange aVisibleRowIndexes = [self rowsInRect:theClipRect];
    NSIndexSet *aSelectedRowIndexes = [self selectedRowIndexes];
    NSInteger aRow = aVisibleRowIndexes.location;
    NSInteger anEndRow = aRow + aVisibleRowIndexes.length;

    for (int aRow; aRow < anEndRow; aRow++) {
        if([aSelectedRowIndexes containsIndex:aRow]) {
            // draw gradient
        }
    }
}

这很好用,但有时没有绘制背景。在下面的屏幕截图中,您可以看到在选择最后一个项目后单击第一个项目时未绘制选择突出显示。

似乎只有当新选择的项目不直接低于或高于旧选择时才会发生这种情况。以 1-2-3-4-5-4-3-2-1 的顺序选择五个项目始终绘制适当的背景,其他任何项目(例如 1-2-5)都不会。

为什么会这样?如果您需要更多详细信息,我很乐意添加更多代码,但同时我不知道在哪里可以搜索此行为。

【问题讨论】:

  • 对于初学者,我会在 for 循环中查看 aRow 的声明,假设这是一个实际的代码 sn-p。如果是这样,您计算的 aRow 将被 for 循环中未初始化的 aRow 替换。

标签: objective-c xcode macos nsoutlineview


【解决方案1】:

这是我使用块的(非常简单的)解决方案:

- (void)highlightSelectionInClipRect:(NSRect)clipRect
{
    [[self selectedRowIndexes] enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) 
     {
         // draw gradient
    }];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    相关资源
    最近更新 更多