代码之家  ›  专栏  ›  技术社区  ›  John Wordsworth

实现NSOutlineView以编辑plist文件的内容

  •  1
  • John Wordsworth  · 技术社区  · 15 年前

    我正在使用cocos2d iphone编写一个游戏,我们的阶段在.plist文件中定义。但是,文件越来越大,所以我开发了一个编辑器,它为进程添加了一些结构,并将大部分plist分解为固定字段。但是,有些元素仍然需要plist编辑器类型功能,因此我在显示“其他参数”的面板上实现了NSOutlineView。我试图复制XCode的“属性列表编辑器”中的功能。

    我已经实现了以下系统; http://www.stupendous.net/archives/2009/01/11/nsoutlineview-example/

    这非常接近我的需要,但有一个问题,我花了今天的大部分时间试图解决。键列的值是通过查找父字典并使用从所选项“向后”计算的;

    return [[parentObject allKeysForObject:item] objectAtIndex:0];
    

    但是,当树中的给定字典中有多个具有相同值的项时,此语句始终返回具有该值的第一个项(它似乎使用isEqualToString:或哈希值比较字符串)。这将导致键列显示“item1,item1,item1”,而不是item1,item2,item3(其中项1-3都有值“”)。我下一次尝试;

    -(NSString*)keyFromDictionary:(NSDictionary*)dict forItem:(id)item
    {
    for( uint i = 0; i < [[dict allKeys] count]; i++ ) {
        id object = [dict objectForKey:[[dict allKeys] objectAtIndex:i]];
    
        if ( &object == &item ) {
            return [[dict allKeys] objectAtIndex:i];
        }
    }   
    
    return nil;
    }
    

    但这总会回来的 . 我希望对NSOutlineView有点经验的人能够提供更好的解决方案。虽然这个问题在链接的示例中只出现一次,但我在从字典中删除项目时必须多次使用它。任何帮助都将不胜感激。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Peter Hosey    15 年前
    return [[parentObject allKeysForObject:item] objectAtIndex:0];
    

    但是,当树中的给定字典中有多个具有相同值的项时,此语句始终返回具有该值的第一个项

    嗯,是的。这就是你让它做的:给我这个值的所有键;给我数组中的第一个项;返回那个。

    此语句始终返回具有该值的第一个项(它似乎使用isEqualToString:或哈希值比较字符串)。

    不是那个语句在做;而是字典的工作方式:每个键只能在字典中出现一次,并且只能有一个对象作为其值,这是通过使用键的散列和发送键来实现的 isEqual: 消息(不是特定于NSString的 isEqualToString: 键不需要是字符串*)。

    凯伊是个问题。

    *反正不在NSDictionary里。当您尝试生成plist输出时,如果字典包含任何非字符串键,则它将出现错误。

    我下一次尝试;

    -(NSString*)keyFromDictionary:(NSDictionary*)dict forItem:(id)item
    {
        for( uint i = 0; i < [[dict allKeys] count]; i++ ) {
            id object = [dict objectForKey:[[dict allKeys] objectAtIndex:i]];
    
            if ( &object == &item ) {
                return [[dict allKeys] objectAtIndex:i];
            }
        }   
    
        return nil;
    }
    

    但这永远都是零。

    这是代码中最小的问题。

    首先,在NSArray上迭代时,除非绝对需要,否则通常不应该使用索引。用起来干净多了 fast enumeration .

    NSUInteger . 当你可以帮助的时候,不要混合和匹配类型。

    object 与参数变量相同 item . 因为它们不是同一个变量,所以测试总是返回false,这就是为什么您从不返回一个对象,而只有其他的出口点返回 nil

    这段代码和前面的一行代码的问题是,您试图从一个值转到一个键,这与字典的工作方式相反:只有键是唯一的;任何数量的键都可以具有相同的值。

    model object 表示每一行将是另一行。

    如果使用模型对象路由,不要忘记防止同一虚拟字典中的多行具有相同的键。NSMutableSet plus实现 hash 会有帮助的。

    您可能还应该对数组的处理方式进行同样的更改。

        2
  •  0
  •   John Wordsworth    15 年前