2012-03-06 82 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 
    }]; 
}