Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 实现静态NSOutlineView_Objective C_Cocoa_Nsoutlineview - Fatal编程技术网

Objective c 实现静态NSOutlineView

Objective c 实现静态NSOutlineView,objective-c,cocoa,nsoutlineview,Objective C,Cocoa,Nsoutlineview,我很难收集到足够多的知识片段,用NSArray中定义的静态、永不改变的结构实现NSOutlineView。很好,但它不能帮助我掌握子菜单。我想它们只是嵌套的nsarray,但我不清楚 假设NSArray中有一个NSArray,定义为 NSArray *subarray = [[NSArray alloc] initWithObjects:@"2.1", @"2.2", @"2.3", @"2.4", @"2.5", nil]; NSArray *ovStructure = [[NSArray a

我很难收集到足够多的知识片段,用NSArray中定义的静态、永不改变的结构实现NSOutlineView。很好,但它不能帮助我掌握子菜单。我想它们只是嵌套的nsarray,但我不清楚

假设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”、“1”()(可展开)和“3”。NSLog显示以“(”开头的数组,因此是第二项。展开它会导致崩溃,因为超出了“界限”。我尝试使用parentForItem:但无法确定结果与什么进行比较


我遗漏了什么?

您包含的链接后面的示例显示了一个NSTreeController,如果我读得正确的话,它会处理子数组内容。因此我认为您的ovStructure不应该是数组,而应该是字典。但是,更根本的是,我认为您应该真正研究NSTreeController。不幸的是,NSTreeController是出了名的很难处理,但去年做了一些改进,甚至我最终也成功了。祝你好运。

嵌套属性列表肯定会带来麻烦。你通常应该创建并处理模型对象。此外,不要查看列标题,它应该根据当前语言的不同而变化(本地化应用程序后);请改用列的标识符。