NSOutlineView与Windows下的Tree控件类似
实现NSOutlineView的关键是实现NSOutlineView的DataSource和Delegate.
即NSOutlineViewDataSource NSOutlineViewDelegate
将此代理与控件连接起来(或使用代码设置datasource和delegate).
这是Cocoa里常用的模式。
- -(id)init
- {
- NSData * xmlData = [NSData dataWithContentsOfFile:@"resource.xml"];
- _xmldoc = [[NSXMLDocument alloc]initWithData:xmlData options:1<<10 error:nil];
- return self;
- }
- -(NSInteger) outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
- {
- return (item==nil)?1:[(NSXMLElement*)item childCount];
- }
- -(BOOL) outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
- {
- NSLog(@"coutn:%lu",[item childCount]);
- return [(NSXMLElement*)item childCount] > 1;
- }
- -(id) outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item
- {
- return (item == nil)?[self.xmldoc rootElement]:[(NSXMLElement*)item childAtIndex:index];
- }
- -(id) outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
- {
- if ([item childCount] == 1)
- {
- return [(NSXMLElement*)item stringValue];
- }
- return [(NSXMLElement*)item name];
- }
- - (BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item {
- return NO;
- }
在获取根的item的时候,这个item默认为nil,所以这里要判断。
每一个item对应一个对象,这个对象自定义,但是显示内容一般都是NSString所以这个ObjectValue应该返回NSString.且与这个数据对象相关联。
NSOutlineView的很多行为需要通过delegate来完成。这个可以通过查阅文档来完成。