NSTreeController - 检索选定的节点

时间:2015-11-30 07:46:47

标签: cocoa nstreecontroller

我在bookController(NSCreeController)中添加了Book对象。现在我想在选择行时获得存储的Book对象。

- (IBAction)addClicked:(id)sender {
    NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970];
    // NSTimeInterval is defined as double

    NSUInteger indexArr[] = {0,0};
    Book *obj = [[Book alloc] init];
    NSString *dateString = [NSDateFormatter localizedStringFromDate:[NSDate date]                                                          dateStyle:NSDateFormatterNoStyle                                                          timeStyle:NSDateFormatterLongStyle];
    obj.title = [NSString stringWithFormat:@"New %@",dateString];
    obj.filename = [NSString stringWithFormat:@"%d",arc4random()%100000];
    [self.booksController insertObject:obj atArrangedObjectIndexPath:[NSIndexPath indexPathWithIndexes:indexArr length:2]];
}

1 个答案:

答案 0 :(得分:0)

我承认可能有更好的解决方案 -

我不熟悉NSTreeController的工作原理,但我看了一下类引用,发现它有一个content属性,类似于NSArrayController(我熟悉抓取它)来自的具体对象 我相信如果content属性实际上是某种树数据结构的类型,我的答案可能不会起作用。类引用说明了content

  

此属性的值可以是对象数组,也可以是a   单根对象。默认值为nil。这个属性是   使用键值观察可观察到。

所以这就是我在历史上对预期结果所做的事情:

NSString *predicateString = [NSString stringWithFormat:NEVER_TRANSLATE(@"(filename == %@) AND (title == %@)"), @"FILENAME_ARGUMENT_HERE", @"TITLE_ARGUMENT_HERE"];
NSArray *matchingObjects = [[self content] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:predicateString]];

然后简单地调用-objectAtIndex:会抓住你的对象。请注意,如果对象不存在,NSArray将为空,如果您有重复的对象,则数组中将有多个对象。

我还搜索了你的问题的答案,并找到了这个SO线程: Given model object, how to find index path in NSTreeController?

如果我的解决方案不起作用,那么看起来很有希望,作者只需逐步完成树并进行isEqual比较。

如果你能(如果不是太麻烦),请在此留言以告诉我什么对你有用,我其实很好奇:)