実装の流れ(カラムのクリック編)
まずOutlineViewをパレットからウィンドウに置きます。
コラムをクリックできるように、Column Selectionにチェックを入れます。
クリックされたコラムがどれなのか簡単に判別できるように、OutlineViewのtableColumnにIdentifier(識別子)をつけます。
outlineViewのOutletsのdataSourceとdelegateを何か(コントローラ)につなぎます。dataSourceはデータの表示部分、delegateはコラムのクリックを受け取ってソートを行います。
dataSourceの先では、
outlineView:outlineView:numberOfChildrenOfItem: outlineView:outlineView:child: ofItem: outlineView:outlineView:isItemExpandable: outlineView:outlineView:objectValueForTableColumn: byItem:
の4つを実装し、データの表示を行います(説明は省略)。
次にdelegateの接続先に、outlineView:shouldSelectTableColumn:を実装します。もし「再度選択したときは整列の順序を逆にする」場合には、前回クリックしたカラムのIdentifierと整列の順序を保存する変数を持っている必要があります。
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectTableColumn:(NSTableColumn *)tableColumn { //(NSString*)lastSortIdentifierは前回選択したカラムの識別子名、 //(BOOL)sortUpは整列の向きを表します。 if (lastSortIdentifier) { if ([lastSortIdentifier isEqualToString:[tableColumn identifier]]) //既にそのコラムを選択していたので、逆順にソートを行う sortUp = !sortUp; else { //新しいコラムを選択し、降順にソートを行う //選択されていたコラムのインジケータを削除しておく [outlineView setIndicatorImage:nil inTableColumn:[outlineView tableColumnWithIdentifier:lastSortIdentifier]]; [lastSortIdentifier release]; lastSortIdentifier = [NSString stringWithString:[tableColumn identifier]]; [lastSortIdentifier retain]; sortUp = YES; } } else { //最初にコラムを選ぶ時はここに来る lastSortIdentifier = [NSString stringWithString:[tableColumn identifier]]; [lastSortIdentifier retain]; sortUp = YES; } //実際にソートを行う(下にそのコードがあります) [self sort:rootItem by:lastSortIdentifier order:sortUp]; //カラムを選択状態にする(NOを返すため) [outlineView setHighlightedTableColumn:tableColumn]; //カラムに整列の向きを示す画像を付ける [outlineView setIndicatorImage: [NSImage imageNamed:sortUp ? @"NSAscendingSortIndicator" : @"NSDescendingSortIndicator"] inTableColumn:tableColumn]; [outlineView reloadData]; return NO; }