2012-01-06 12 views
5

新しいプログラムのソースリストを作成しようとしていますが、ビューベースのNSOutlineViewを使用して少し問題があります。私のコードは、セルベースのNSOutlineViewを使用して正常に動作するので、何が起こっているのか少し混乱しています。私は、デバッガを介してこれを実行すると、それはoutlineView:objectValueForTableColumn:byItem:が実行されないことがわかりoutlineView:objectValueForTableColumn:byItem:not called

#pragma mark - 
#pragma mark NSOutlineView Delegate 

- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item { 
    return (item == nil) ? YES : [(SourceListNode *)item groupItem]; 
} 

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    if ([(SourceListNode *)item groupItem]) { 
     return [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
    } 
    else { 
     return [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
    } 
} 

#pragma mark - 
#pragma mark NSOutlineView Data Source 

- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { 
    return (item == nil) ? [sourceListNodes count] : [(SourceListNode *)item numberOfChildren]; 
} 

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { 
    return (item == nil) ? YES : ([(SourceListNode *)item numberOfChildren] > 0); 
} 

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { 
    return (item == nil) ? [sourceListNodes objectAtIndex:index] : [(SourceListNode *)item childAtIndex:index]; 
} 

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { 
    return [(SourceListNode *)item name]; 
} 

はここでデリゲートとデータソースのために私のコードです。結果はテキストのないアウトラインビューになります。正しいセルが作成され、それらを選択して展開することができます。私は何が欠けていますか?

UPDATE:IBでソースリストを削除し、新しいリストを追加してコントローラオブジェクトに接続しました。結果は良好でしたが、ヘッダーセルにはテキスト "HEADER CELL"があり、子セルには "Table View Cell"がありました。

もう一度デバッガでプログラムを実行しましたが、今度はoutlineView:objectValueForTableColumn:byItem:が実行されました。それは、しかし、細胞のテキストを入力しませんでした。

次のように私はその後outlineView:viewForTableColumn:item:を更新:

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    NSTableCellView *result; 
    if ([(SourceListNode *)item groupItem]) { 
     result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
    } 
    else { 
     result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
    } 

    [[result textField] setStringValue:[(SourceListNode *)item name]]; 

    return result; 
} 

期待通りに今すぐすべての作品。

要するに、私は私の問題を解決しました。しかし、今私は別の質問があります。ビューベースのアウトラインビューにはoutlineView:objectValueForTableColumn:byItem:の目的は何ですか?実行されますが、何もしないように見えます。

+0

こんにちはJohn、ビューベースのアウトラインビューでobjectValueForTableColumnが必要な理由を理解しましたか?私は自分自身も同じことを思っています。 – Indoor

答えて

4

ビューベースは、セルベースとは異なるものです。

"id"戻り値を "NSView"に置き換えている点が異なります。

変更この:これに

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item 

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item 

がこれはあなたが10.7を実行している、とあなたが実際にはNSViewのを返すようにを予定しているという仮定を与えています。

+0

'id'を' NSView * 'に変更しました。それは私の更新の結果を元の投稿に変更しませんでした。 –

+0

これをキャッチしていただきありがとうございます。 –

+0

NSTableCellViewを返さないでください。 NSViewを返します。返すNSViewには、初期化されたフレームがなくてもかまいません。 NSControlはそれを制御します。新しいNSViewを実装し、要素を追加してから返します。 – evdude100

関連する問題