3

NSOutlineViewで複数の列をインデントするための最も簡単な方法または推奨される方法は何ですか?デフォルトでは、アウトライン列のみをインデントします。私の知る限り、他の列をインデントするための組み込みのサポートはありません。

2セットの階層データ間の比較を示すNSOutlineViewがあります。視覚的にアピールするために、アウトライン列の一部のアイテムがインデントされている場合、別の列の同じ行のアイテムを同じインデント量でインデントしたいと思います。(2つの項目を比較した結果を示す3番目の列もあります。この列はインデントしないでください。)

これは、NSOutlineViewをサブクラス化することによってのみ達成できますか?そして、サブクラスで何をオーバーライドする必要がありますか?または、複数の列をインデントする簡単な方法はありますか?

4

1 に答える 1

2

思ったより簡単だった。これが解決策のスケッチです。NSOutlineViewのアウトライン列以外の列をインデントするには、次のことができます。

  • その列に使用するNSCellクラスのサブクラス(MYIndentedCellなど)を作成します
  • インスタンス変数indentationをMYIndentedCellに追加し、それにアクセサーとミューテーターメソッドを提供します
  • MYIndentedCellの少なくともdrawWithFrame:inView:を次のようにオーバーライドします。
     -(void)drawWithFrame:(NSRect)frame inView:(NSView *)view
     {{
       NSRectnewFrame=フレーム;
       newFrame.origin.x+=インデント;
       newFrame.size.width-=インデント;
       [スーパーdrawWithFrame:newFrame inView:ビュー];
     }
  • 列が編集可能である場合は、上記editWithFrame:inViewと同様にオーバーライドする必要がありますselectWithFrame:inView:
  • cellSizeを次のようにオーバーライドします。
     -(NSSize)cellSize
     {{
       NSSize cellSize=[スーパーcellSize];
       cellSize.width+=インデント;
       cellSizeを返します。
     }
  • 最後に、NSOutlineViewのアウトライン列のインデントに続く列のインデントを取得することは、アウトラインビューのデリゲートによって処理されます。デリゲートは、以下を実装する必要があります。
     -(void)outlineView:(NSOutlineView *)ビュー
              willDisplayCell:(id)セル
              forTableColumn:(NSTableColumn *)列
              アイテム:(id)アイテム
     {{
       if(column == theColumnToBeIndented){
         [セルsetIndentation:
                  [view indentationPerLevel] * [view levelForItem:item]];
       }
     }

それでも問題が解決しない場合はImageAndTextCell.m、AppleのSourceViewサンプルコードを参照してください。これは、上記の方法を理解するのに非常に役立ちます。

于 2010-03-16T08:53:56.203 に答える