实现静态NSOutlineView

时间:2010-04-19 06:41:18

标签: objective-c cocoa nsoutlineview

我很难将足够的知识片段拼凑在一起,以实现一个NSOutlineView,它具有在NSArray中定义的静态,永不改变的结构。 This link一直很棒,但它并没有帮助我掌握子菜单。我认为他们只是嵌套的NSArrays,但我没有明确的想法。

假设我们在NSArray中有一个NSArray,定义为

NSArray *subarray = [[NSArray alloc] initWithObjects:@"2.1", @"2.2", @"2.3", @"2.4", @"2.5", nil];
NSArray *ovStructure = [[NSArray alloc] initWithObjects:@"1", subarray, @"3", nil];

文本在outlineView中定义:objectValueForTableColumn:byItem:。

- (id)outlineView:(NSOutlineView *)ov objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)ovItem
{
    if ([[[tableColumn headerCell] stringValue] compare:@"Key"] == NSOrderedSame)
    {
        // Return the key for this item. First, get the parent array or dictionary.
        // If the parent is nil, then that must be root, so we'll get the root
        // dictionary.

        id parentObject = [ov parentForItem:ovItem] ? [ov parentForItem:ovItem] : ovStructure;

    if ([parentObject isKindOfClass:[NSArray class]])
        {
            // Arrays don't have keys (usually), so we have to use a name
            // based on the index of the object.

        NSLog([NSString stringWithFormat:@"%@", ovItem]);
            //return [NSString stringWithFormat:@"Item %d", [parentObject indexOfObject:ovItem]];
        return (NSString *) [ovStructure objectAtIndex:[ovStructure indexOfObject:ovItem]];
        }
    }
    else
    {
        // Return the value for the key. If this is a string, just return that.

        if ([ovItem isKindOfClass:[NSString class]])
        {
            return ovItem;
        }
        else if ([ovItem isKindOfClass:[NSDictionary class]])
        {
            return [NSString stringWithFormat:@"%d items", [ovItem count]];
        }
        else if ([ovItem isKindOfClass:[NSArray class]])
        {
            return [NSString stringWithFormat:@"%d items", [ovItem count]];
        }
    }

    return nil;
}

结果为'1','('(可扩展)和'3'。NSLog显示以'('开头的数组,因此第二项。扩展它会导致因超出边界而崩溃。我尝试使用parentForItem:但无法找出将结果与之比较的内容。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

你所包含的链接背后的例子显示了一个NSDictionary来处理子阵列的东西,如果我正确地阅读它。所以我认为你的ovStructure不应该是一个数组而应该是一个字典。但是,从根本上说,我认为你应该真正关注NSTreeController。不幸的是,NSTreeController很难与之合作,但去年进行了改进,甚至我最终都在努力。祝你好运。