13

私はNSOutlineView なし NSTreeControllerで使用しており、独自のデータソースを実装しています。アイテムを選択する最良の方法は何ですか? NSOutlineViewサポート済みexpandItem:ですcollapseItem:。そして、selectItem: のような便利なメソッドがありません。どうすればプログラムでそれを行うことができますか?

ありがとうございました。

4

6 に答える 6

23

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

解決策は、を使用して項目の行インデックスを取得し、rowForItem:それが -1 でない場合 (項目が表示されない/見つからない)、でインデックス セットを作成し、[NSIndexSet indexSetWithIndex:]そのインデックス セットをselectRowIndexes:byExtendingSelection:メソッドに渡すことです。

于 2009-07-08T11:18:15.883 に答える
22

これが私がついに終わった方法です。提案や訂正はいつでも大歓迎です。

@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
于 2009-08-19T13:11:39.070 に答える
2

いいえ、方法はありませんが、selectItem:方法はありrowForItem:ます。上記の使用に関するピーターのアドバイスとそれを組み合わせると、selectRowIndexes:byExtendingSelection:必要なすべての情報が得られるはずです。

アイテムを選択する方法が本当に必要な場合は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];
}

このコードが実際に機能するかどうかはわかりません。概念を説明するために、それを破っただけです。

于 2009-07-08T14:31:30.017 に答える
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

于 2011-06-04T19:55:06.340 に答える