一千萬個為什麽

搜索

實現靜態NSOutlineView


我很難將足夠的知識片段拼湊在一起,以實現一個NSOutlineView,它具有在NSArray中定義的靜態,永不改變的結構。 此鏈接非常棒,但它並沒有幫助我掌握子菜單。我認為他們只是嵌套的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:但無法弄清楚要比較結果的內容。

我錯過了什麽?

最佳答案

你所包含的鏈接背後的例子顯示了一個NSDictionary來處理子陣列的東西,如果我正確地讀它。所以我認為你的ovStructure不應該是一個數組而應該是一個字典。但是,從根本上說,我認為你應該真正關註NSTreeController。不幸的是,NSTreeController很難與之合作,但去年進行了改進,甚至我最終都在努力。祝你好運。

轉載註明原文: 實現靜態NSOutlineView

猜你喜歡