Frage

Ich bin mit NSOutlineView ohne NSTreeController und habe meine eigene Datenquelle umgesetzt. Was ist der beste Weg, um ein Element auszuwählen? NSOutlineView Unterstützung bereits expandItem: und collapseItem:. Und ich bin eine praktische Methode, wie `selectItem fehlt :. Wie kann ich es tun programmatisch?

Danke.

War es hilfreich?

Lösung

Denken Sie daran, in Oberklassen zu suchen, wenn Sie etwas nicht finden können. In diesem Fall wird eine der Methoden, die Sie kommt von NSTableView benötigen, die NSOutlineView unmittelbare Superklasse ist.

Die Lösung ist auf erhalten den Zeilenindex für das Element rowForItem: verwenden, und wenn dies nicht der Fall -1 (Artikel nicht sichtbar / nicht gefunden), einen Index mit es mit [NSIndexSet indexSetWithIndex:] gesetzt erstellen und diesen Index passieren auf die selectRowIndexes:byExtendingSelection: Methode

.

Andere Tipps

Hier ist, wie ich endete schließlich auf. Vorschläge und Korrekturen sind immer willkommen.

@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

Nein, es gibt keine selectItem: Methode, aber es ist eine rowForItem: Methode. Wenn Sie oben mit Peters Beratung über die Verwendung von selectRowIndexes:byExtendingSelection: kombinieren, dass, sollten Sie alle Informationen, die Sie benötigen.

Wenn Sie wirklich eine Methode haben, wollen ein Element auszuwählen, das würde ich rufen setSelectedItem: für Konsistenz willen empfehlen, Sie so etwas in einer Kategorie auf NSOutlineView schreiben könntest

- (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];
}

Ich habe keine Ahnung, ob dieser Code tatsächlich funktioniert; Ich stürzte es direkt an das Konzept zu erläutern.

Hier ist ein Code-Snippet ich verwenden, um programmatisch auf ein Element in einem PXSourceList zu wählen.

Quellliste ist ein regelmäßiges PXSouceList Objekt und ich wollte das zweite Element in der ersten Gruppe der Kontur wählen.

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

Wenn Sie noch nicht wissen, ist PXSourceList ein ausgezeichneter Ersatz für eine NSOutlineView, wenn Sie für itunes / mail Stil umreißt wieder suchen. Pick it up hier: PxSourceList

Dies ist eine alte Frage, aber die Situation ist immer noch die gleiche. Da es eine Anfrage für eine rasche Version war, hier ist mein nehmen. Ich habe nicht die akzeptierte Antwort finden, für mich zu arbeiten, wie ich glaube, Sie direkt mit der Datenquelle Klasse interagieren sollten, anstatt die NSOutlineView erstrecken. Dummerweise finden die Umrisse nicht Zeilen, wenn sie erweitert werden, weshalb es einfacher ist Ihre Datenquelle zu verwenden. In meinem Fall fand ich, dass Sie die Eltern Ihrer Artikel in umgekehrter Reihenfolge zu erweitern haben, so dass Sie auf der obersten Ebene beginnen und Ihren Weg in Richtung des tatsächlichen Einzel arbeiten Sie zu erweitern versuchen. Ich fühle mich wie das sollte gebaut werden, aber wenn ich etwas verpasst - es ist nicht

.

In diesem Beispiel FileItem ist meine Datenquelle Auflistelement Klasse. Es enthält eine Eigenschaft „Eltern“, die gültig sein muss, wenn es Teil der Hierarchie angezeigt wird.

func selectItem(_ item: FileItem, byExtendingSelection: Bool = false) {
    guard let outlineView = outlineView else { return }

    var itemIndex: Int = outlineView.row(forItem: item)

    if itemIndex < 0 {
        var parent: FileItem? = item

        var parents = [FileItem?]()
        while parent != nil {
            parents.append(parent)
            parent = parent?.parent
        }

        let reversedTree = parents.compactMap({$0}).reversed()

        for level in reversedTree {
            outlineView.expandItem(level, expandChildren: false)
        }

        itemIndex = outlineView.row(forItem: item)
        if itemIndex < 0 {
            print("Didn't find", item)
            return
        }
    }

    print("Expanding row", itemIndex)

    outlineView.selectRowIndexes(IndexSet(integer: itemIndex), byExtendingSelection: byExtendingSelection)
    outlineView.scrollRowToVisible(itemIndex)
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top