2012-03-06 80 views
0

要定制默认的蓝色渐变高亮风格我做了一个子类的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 
     } 
    } 
} 

这工作得很好,但有时背景未画出。在下面的屏幕截图中,您可以看到如何在选择最后一个选项后点击第一个项目时未选择突出显示。

Loosing selection highlight on step 4

看来,如果这只是发生如果新选择的项目是不是正下方或上方选择一个旧的。以1-2-3-4-5-4-3-2-1的顺序选择五个项目总是会绘制适当的背景,而不是其他任何内容(例如1-2-5)。

这是怎么发生的?如果您需要更多详细信息,我将很高兴添加更多代码,但与此同时,我不知道在哪里寻找此行为。

+0

对于初学者来说,我想看看AROW在for循环声明,假设这是一个实际的代码片段。如果是这样,您计算的aRow将被for循环中未初始化的aRow替换。 – gaige 2012-03-06 21:44:46

回答

1

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

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