実装の流れ(カラムのクリック編)

まず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;
}