Pregunta

Estoy usando NSOutlineView sin NSTreeController y han puesto en práctica mi propia fuente de datos. ¿Cuál es la mejor manera de seleccionar un artículo? apoyo NSOutlineView ya expandItem: y collapseItem:. Y me falta un método útil como `selectItem :. ¿Cómo puedo hacerlo mediante programación?

Gracias.

¿Fue útil?

Solución

Recuerde que debe buscar en superclases cuando no se puede encontrar algo. En este caso, uno de los métodos que necesita proviene de NSTableView, que es superclase inmediata de NSOutlineView.

La solución es obtener el índice de la fila para el elemento utilizando rowForItem: , y si no es -1 (elemento no visible / no encontrado), crear un índice establecido con él con [NSIndexSet indexSetWithIndex:] y pasar que el índice se define en el método selectRowIndexes:byExtendingSelection:

.

Otros consejos

Así es como finalmente terminé. Sugerencias y correcciones son siempre bienvenidas.

@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

No, no es un método selectItem:, pero no es un método rowForItem:. Si lo combinas con el consejo de Pedro sobre el uso de selectRowIndexes:byExtendingSelection: anteriormente, usted debe tener toda la información que necesita.

Si realmente quería tener un método para seleccionar un elemento, que se lo recomendaría setSelectedItem: llamando para mantener la coherencia, se podría escribir algo como esto en una categoría en 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];
}

No tengo idea de si este código funciona en realidad; Yo sólo lo arrojó fuera para ilustrar el concepto.

Aquí es un fragmento de código que utiliza para seleccionar la programación un elemento en un PXSourceList.

Lista origen es un objeto PXSouceList regular y me quería para seleccionar el segundo elemento en el primer grupo del contorno.

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

Si usted no sabe, sin embargo, PXSourceList es un excelente sustituto para una NSOutlineView si usted está buscando el estilo itunes / mail recogidas en ella. Recogerlo aquí: PxSourceList

Esta es una vieja pregunta, pero la situación sigue siendo la misma. Ya que había una solicitud de una versión rápida, aquí está mi tomar. No he encontrado la respuesta aceptada para trabajar para mí, como creo que debe interactuar directamente con su clase de origen de datos en lugar de extender la NSOutlineView. Era un fastidio, el esquema no encontrará filas a menos que se expanden por lo que es más fácil de usar su fuente de datos. En mi caso he encontrado que hay que ampliar el padre de sus elementos en orden inverso, por lo que se inicia en el nivel superior y su forma de trabajo hacia el artículo, de lo que está tratando de expandirse. Siento como que debe ser incorporada, pero a menos que me haya perdido algo - no es

.

En este ejemplo FileItem es mi fuente de datos de clase elemento de la colección. Contiene una propiedad "padre", que debe ser válido si es parte de la jerarquía mostrada.

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)
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top