По заданному объекту модели, как найти индексный путь в NSTreeController? - PullRequest
8 голосов
/ 29 января 2012

Учитывая объекты модели, которые представляет NSTreeController, как вы находите их пути индекса в дереве и затем выбираете их? Кажется, это ослепительно очевидная проблема, но я не могу найти какую-либо ссылку на нее. Есть идеи?

Ответы [ 2 ]

18 голосов
/ 29 января 2012

Нет «простого» пути, вам нужно пройтись по узлам дерева и найти соответствующий путь индекса, что-то вроде:

Objective-C:

Категория

@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:

Extension

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
    }
}
0 голосов
/ 12 февраля 2014

Почему бы не использовать NSOutlineView для получения родительских элементов, таких как:

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);

Это выдаст:вы ищете здесь путь к файлу, но вы можете настроить его для любого источника данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...