Считаете ли вы использование NSTreeController
? Он помогает управлять контурным представлением для вас и очень удобен. NSTreeController
использует класс NSTreeNode
для представления узлов в виде схемы, а каждый NSTreeNode
имеет метод representedObject
, который позволяет вам перейти к объекту модели.
В любом случае, если вы не хотите использовать NSTreeController
или NSTreeNode
, вы можете просто вернуть объект модели напрямую. Вот пример кода Objective-C из руководства Apple.
@implementation DataSource
// Data Source methods
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
return (item == nil) ? 1 : [item numberOfChildren];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
return (item == nil) ? YES : ([item numberOfChildren] != -1);
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
return (item == nil) ? [FileSystemItem rootItem] : [(FileSystemItem *)item childAtIndex:index];
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
return (item == nil) ? @"/" : [item relativePath];
}
@end
@interface FileSystemItem : NSObject
{
NSString *relativePath;
FileSystemItem *parent;
NSMutableArray *children;
}
+ (FileSystemItem *)rootItem;
- (NSInteger)numberOfChildren;// Returns -1 for leaf nodes
- (FileSystemItem *)childAtIndex:(NSUInteger)n; // Invalid to call on leaf nodes
- (NSString *)fullPath;
- (NSString *)relativePath;
@end
@implementation FileSystemItem
static FileSystemItem *rootItem = nil;
static NSMutableArray *leafNode = nil;
+ (void)initialize {
if (self == [FileSystemItem class]) {
leafNode = [[NSMutableArray alloc] init];
}
}
- (id)initWithPath:(NSString *)path parent:(FileSystemItem *)parentItem {
self = [super init];
if (self) {
relativePath = [[path lastPathComponent] copy];
parent = parentItem;
}
return self;
}
+ (FileSystemItem *)rootItem {
if (rootItem == nil) {
rootItem = [[FileSystemItem alloc] initWithPath:@"/" parent:nil];
}
return rootItem;
}
// Creates, caches, and returns the array of children
// Loads children incrementally
- (NSArray *)children {
if (children == nil) {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *fullPath = [self fullPath];
BOOL isDir, valid;
valid = [fileManager fileExistsAtPath:fullPath isDirectory:&isDir];
if (valid && isDir) {
NSArray *array = [fileManager contentsOfDirectoryAtPath:fullPath error:NULL];
NSUInteger numChildren, i;
numChildren = [array count];
children = [[NSMutableArray alloc] initWithCapacity:numChildren];
for (i = 0; i < numChildren; i++)
{
FileSystemItem *newChild = [[FileSystemItem alloc]
initWithPath:[array objectAtIndex:i] parent:self];
[children addObject:newChild];
[newChild release];
}
}
else {
children = leafNode;
}
}
return children;
}
- (NSString *)relativePath {
return relativePath;
}
- (NSString *)fullPath {
// If no parent, return our own relative path
if (parent == nil) {
return relativePath;
}
// recurse up the hierarchy, prepending each parent’s path
return [[parent fullPath] stringByAppendingPathComponent:relativePath];
}
- (FileSystemItem *)childAtIndex:(NSUInteger)n {
return [[self children] objectAtIndex:n];
}
- (NSInteger)numberOfChildren {
NSArray *tmp = [self children];
return (tmp == leafNode) ? (-1) : [tmp count];
}
- (void)dealloc {
if (children != leafNode) {
[children release];
}
[relativePath release];
[super dealloc];
}
@end
Это не MonoMac, но должна быть той же идеей.
Большое спасибо, это было решение –