2010-03-10 79 views
3

製作NSOutlineView縮進多列的最簡單或推薦的方法是什麼?默認情況下,它只縮進輪廓列;據我所知,沒有內置的支持使其縮進其他列。如何使一個NSOutlineView縮進多列?

我有一個NSOutlineView顯示兩組分層數據之間的比較。對於視覺上訴,如果大綱列中的某個項目縮進,我想用相同的縮進量縮進另一列中同一行上的項目。 (還有第三列顯示比較兩個項目的結果,此列不應縮進。)

只能通過子類化NSOutlineView來實現嗎?哪些需要在子類中重寫?還是有更簡單的方法讓它縮進多列?

回答

2

結果比我預想的要容易。這是解決方案的草圖。若要縮進比大綱列之外的列在NSOutlineView,您可以:

  • 創建您將使用該列的的NSCell類的子類,說MYIndentedCell
  • 添加一個實例變量indentation到MYIndentedCell,並提供一個存取和mutator方法爲它
  • 覆蓋至少drawWithFrame:inView:在MYIndentedCell到:
 
    - (void) drawWithFrame: (NSRect) frame inView: (NSView*) view 
    { 
     NSRect newFrame = frame; 
     newFrame.origin.x += indentation; 
     newFrame.size.width -= indentation; 
     [super drawWithFrame: newFrame inView: view]; 
    } 
  • 您還需要重寫和selectWithFrame:inView:類似上面如果列都可以編輯
  • 覆蓋CELLSIZE到:
 
    - (NSSize) cellSize 
    { 
     NSSize cellSize = [super cellSize]; 
     cellSize.width += indentation; 
     return cellSize; 
    } 
  • 最後,得到了壓痕列跟隨NSOutlineView的大綱列的縮進將由大綱視圖的委託來處理。委託需要實現以下:
 
    - (void) outlineView: (NSOutlineView *) view 
       willDisplayCell: (id) cell 
       forTableColumn: (NSTableColumn *) column 
       item: (id) item 
    { 
     if (column == theColumnToBeIndented) { 
     [cell setIndentation: 
        [view indentationPerLevel] * [view levelForItem: item]]; 
     } 
    } 

如果您仍然無法得到它的工作,你可能要採取蘋果的SourceView sample code看看ImageAndTextCell.m,我發現在搞清楚如何很有幫助做到以上。