2009-07-08 5 views
8

私はNSOutlineViewを使用せず、NSTreeControllerを使用せず、独自のデータソースを実装しています。アイテムを選択する最善の方法は何ですか? NSOutlineViewがすでにサポートexpandItem:collapseItem:です。そして、 `selectItem:のような便利なメソッドがありません。プログラム的にはどうしたらいいですか?NSTreeControllerなしでNSOutlineViewの項目を選択するにはどうすればいいですか?

ありがとうございます。

答えて

15

何かが見つからないときは、スーパークラスを調べてください。この場合、必要なメソッドの1つは、NSOutlineViewの直接のスーパークラスであるNSTableViewからのものです。

解決策はget the row index for the item using rowForItem:になり、-1(項目が表示されない/見つからない)場合はcreate an index set with it with [NSIndexSet indexSetWithIndex:]となり、そのインデックスはthe selectRowIndexes:byExtendingSelection: methodに設定されます。

+0

こんにちはピーター、答えてくれてありがとう。私はすでにselectRowIndexes:byExtendingSelection:メソッドを知っています。問題は、NSOutlineViewがNSIndexPathではなくNSIndexPathで動作していることです。 – cocoafan

+0

NSOutlineViewドキュメントにNSIndexPathのインスタンスが1つも表示されません。おそらくあなたはNSTreeControllerを使用していないと考えているでしょう。さらに、アウトラインビュー*はテーブルビューです。つまり、すべてのテーブルビュー機能はアウトラインビューで正常に機能するはずです。 –

+0

はい、あります。悪いことに、私のデータソースに依存しない組み込みのソリューションはありません。私はデータソースに余分なコードを書く必要がありますか? – cocoafan

1

いいえ、selectItem:メソッドはありませんが、rowForItem:メソッドがあります。上記のselectRowIndexes:byExtendingSelection:の使用に関するPeterの助言と組み合わせて使用​​する場合は、必要なすべての情報が必要です。

あなたは本当に私が一貫性のためにsetSelectedItem:を呼び出すことをお勧めアイテムを、選択するための方法を持っていると思った場合、あなたはNSOutlineView

- (void)setSelectedItem:(id)item { 
    NSInteger itemIndex = [self rowForItem:item]; 
    if (itemIndex < 0) { 
     // You need to decide what happens if the item doesn't exist 
     return; 
    } 

    [self selectRowIndexes:[NSIndexSet indexSetWithIndex:itemIndex] byExtendingSelection:NO]; 
} 

にカテゴリでこのような何かを書くことができ、私は見当がつかない場合このコードは実際に動作します。私はその概念を説明するためにそれを打ち消した。

+0

あなたの助けを借りて、お互いに感謝します。 – cocoafan

18

私は最終的にどのように終わったのですか?提案や修正はいつでも歓迎します。

@implementation NSOutlineView (Additions) 

- (void)expandParentsOfItem:(id)item { 
    while (item != nil) { 
     id parent = [self parentForItem: item]; 
     if (![self isExpandable: parent]) 
      break; 
     if (![self isItemExpanded: parent]) 
      [self expandItem: parent]; 
     item = parent; 
    } 
} 

- (void)selectItem:(id)item { 
    NSInteger itemIndex = [self rowForItem:item]; 
    if (itemIndex < 0) { 
     [self expandParentsOfItem: item]; 
     itemIndex = [self rowForItem:item]; 
     if (itemIndex < 0) 
      return; 
    } 

    [self selectRowIndexes: [NSIndexSet indexSetWithIndex: itemIndex] byExtendingSelection: NO]; 
} 
@end 
+2

これらの方法をありがとう。彼らは信じられないほど便利です!私の意見では、この答えは以前に受け入れられたものよりも完全で精巧です。 –

0

ここでは、PXSourceListの項目をプログラムで選択するためのコードスニペットを示します。

sourceListは通常のPXSouceListオブジェクトです。アウトラインの最初のグループで2番目のアイテムを選択したかったのです。

NSInteger itemRow = [sourceList rowForItem:[[(SourceListItem *)[sourceListItems objectAtIndex:0] children] objectAtIndex:1]]; 
    [sourceList selectRowIndexes:[NSIndexSet indexSetWithIndex:itemRow] byExtendingSelection:YES]; 

あなたがまだ知らない場合は、再度のiTunes /メールスタイルのアウトラインを探している場合、PXSourceListはNSOutlineViewための優れた代替品です。ここでピックアップしてください: PxSourceList

関連する問題