将NSTreeController跟NSOutlineView绑定起来之后又想在delegate或datasource里取出自定义结点数据来控制OutlineView的行为。这样应该怎么办呢?

这里解释一下。

NSTreeController在生成树的时候会使用NSTreeNode类,这个类是Cocoa自带的类,所有的结点都会转换成此类型,比如我使用自定义类DTTreeNode作自定义结点。NSTreeNode会把它封装。

这里我尝试了一下在delegate里,item参数是NSTreeControllerTreeNode类型,Cocoa里根本没有这个类型,这个类型应该是运行时生成的。它就是NSTreeNode类对象。

查一下NSTreeNode类的文档:

有这么一个方法:- (id)representedObject

经测试它返回的就是DTTreeNode自定义节点类型。

那么举例如下:

  1. -(BOOL) outlineView:(NSOutlineView *)outlineView shouldExpandItem:(id)item 
  2.     if ([[(DTTreeNode*)[(NSTreeNode*)item representedObject] children] count] > 0)  
  3.     { 
  4.         return YES; 
  5.     } 
  6.     return NO; 

这个就可以访问自定义节点数据了。