2012-01-29 17 views

Respuesta

18

No hay manera "fácil", que tienen que caminar los nodos del árbol y encontrar un camino de adaptación de índices, algo así como:

Objective-C:

Categoría

@implementation NSTreeController (Additions) 

- (NSIndexPath*)indexPathOfObject:(id)anObject 
{ 
    return [self indexPathOfObject:anObject inNodes:[[self arrangedObjects] childNodes]]; 
} 

- (NSIndexPath*)indexPathOfObject:(id)anObject inNodes:(NSArray*)nodes 
{ 
    for(NSTreeNode* node in nodes) 
    { 
     if([[node representedObject] isEqual:anObject]) 
      return [node indexPath]; 
     if([[node childNodes] count]) 
     { 
      NSIndexPath* path = [self indexPathOfObject:anObject inNodes:[node childNodes]]; 
      if(path) 
       return path; 
     } 
    } 
    return nil; 
} 
@end  

Swift:

Extensión

extension NSTreeController { 

    func indexPathOfObject(anObject:NSObject) -> NSIndexPath? { 
     return self.indexPathOfObject(anObject, nodes: self.arrangedObjects.childNodes) 
    } 

    func indexPathOfObject(anObject:NSObject, nodes:[NSTreeNode]!) -> NSIndexPath? { 
     for node in nodes { 
      if (anObject == node.representedObject as! NSObject) { 
       return node.indexPath 
      } 
      if (node.childNodes != nil) { 
       if let path:NSIndexPath = self.indexPathOfObject(anObject, nodes: node.childNodes) 
       { 
        return path 
       } 
      } 
     } 
     return nil 
    } 
} 
+1

Ouch, eso es realmente ineficiente. Estoy pensando en escribir una subclase de treecontroller que mantenga un mapeo entre el modelo y treenodes. O tal vez una categoría en el modelo que mantiene referencias al treenode asociado. – Tony

+0

Todo lo que necesitaría hacer en su subclase es mantener un 'NSMutableArray' plano de los nodos de árbol. Debería tener cuidado de que todas las modificaciones de los nodos se reflejen en su matriz, por supuesto. –

+0

Hmm, estaba pensando en un mapeo 'NSMutableDictionary' ya sea el objeto modelo o el objectID a' NSTreeNode's, ya que parece más eficiente para la búsqueda. ¿Hay alguna razón por la que 'NSmutableArray' funcione mejor? – Tony

-1

Por qué no usar el NSOutlineView para obtener los elementos principales de este tipo:

NSMutableArray *selectedItemArray = [[NSMutableArray alloc] init]; 

[selectedItemArray addObject:[self.OutlineView itemAtRow:[self.OutlineView selectedRow]]]; 

while ([self.OutlineView parentForItem:[selectedItemArray lastObject]]) { 
    [selectedItemArray addObject:[self.OutlineView parentForItem:[selectedItemArray lastObject]]]; 
} 

NSString *selectedPath = @"."; 
while ([selectedItemArray count] > 0) { 
    OBJECTtype *singleItem = [selectedItemArray lastObject]; 
    selectedPath = [selectedPath stringByAppendingString:[NSString stringWithFormat:@"/%@", singleItem.name]]; 
    selectedItemArray removeLastObject]; 
} 

NSLog(@"Final Path: %@", selectedPath); 

Esta voluntad de salida: ./item1/item2/item3/...

Supongo que está buscando una ruta de archivo aquí, pero puede ajustar lo que su origen de datos pueda representar.

+0

La pregunta es buscar un NSIndexPath para cualquier objeto dado en el árbol, de modo que pueda cambiar programmatic selectedIndexPath (s) del controlador de árbol a aquel programáticamente. Estás asumiendo que el objeto ya está seleccionado. Si es así, ¡obtendría la selectionIndexPath del controlador de árbol! – stevesliva

Cuestiones relacionadas