Question

J'utilise NSOutlineView sans NSTreeController et ont mis en œuvre ma propre source de données. Quelle est la meilleure façon de choisir un article? soutien NSOutlineView déjà expandItem: et collapseItem:. Et je manque une méthode pratique comme `selectItem :. Comment puis-je faire programatically?

Merci.

Était-ce utile?

La solution

N'oubliez pas de regarder dans superclasses quand vous ne pouvez pas trouver quelque chose. Dans ce cas, l'une des méthodes dont vous avez besoin vient de NSTableView, qui est superclasse immédiat NSOutlineView.

La solution est de obtenir l'index de ligne de l'article à l'aide rowForItem:, et si elle n'est pas -1 (article non visible / non trouvée), créer un index ensemble avec avec [NSIndexSet indexSetWithIndex:] et passer cet index défini sur la méthode de selectRowIndexes:byExtendingSelection:

.

Autres conseils

Voici comment j'ai enfin fini. Les suggestions et corrections sont toujours les bienvenus.

@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

Non, il n'y a pas une méthode de selectItem:, mais il existe une méthode de rowForItem:. Si vous combinez cela avec les conseils de Peter sur l'utilisation selectRowIndexes:byExtendingSelection: ci-dessus, vous devriez avoir toutes les informations dont vous avez besoin.

Si vous voulez vraiment avoir une méthode pour sélectionner un élément, que je recommande d'appeler setSelectedItem: pour souci de cohérence, vous pourriez écrire quelque chose comme ça dans une catégorie sur 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];
}

Je ne sais pas si ce code fonctionne réellement; Je viens de précipitai hors tension pour illustrer le concept.

Voici un extrait de code I utilisé pour sélectionner un programme dans un élément PXSourceList.

SourceList est un objet régulier de PXSouceList et je voulais sélectionner le deuxième élément dans le premier groupe du contour.

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

Si vous ne connaissez pas encore, PXSourceList est un excellent remplacement pour un NSOutlineView si vous êtes à la recherche d'un style itunes / mail donne un aperçu. Prenez-le ici: PxSourceList

Ceci est une question ancienne, mais la situation est toujours la même. Comme il y avait une demande pour une version rapide, voici mon. Je ne trouve pas la réponse accepté de travailler pour moi comme je pense que vous devriez interagir directement avec votre classe source de données plutôt que d'étendre la NSOutlineView. Fâcheusement, le contour ne trouvera pas les lignes sauf si elles sont étendues ce qui explique pourquoi il est plus simple d'utiliser votre dataSource. Dans mon cas, je trouve que vous devez développer la mère de vos articles dans l'ordre inverse, de sorte que vous commencez au niveau supérieur et de travailler votre chemin vers le produit que vous essayez de développer. Je me sens comme ça devrait être construit, mais à moins que je manqué quelque chose - ce n'est pas

.

Dans cet exemple FileItem est ma source de données classe d'élément de collection. Il contient une propriété « parent » qui doit être valable que si elle fait partie de la hiérarchie affichée.

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)
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top