Проблема, когда ячейки NSOutlineView имеют одинаковое значение

У меня есть приложение Mac OS X, которое использует NSOutlineView с двумя столбцами: ключ и значение, где вы можете редактировать столбец значения. У меня либо есть NSString, либо NSDictionary подряд. Код значения ячеек выглядит следующим образом:

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {

    if ([[[tableColumn headerCell] stringValue] isEqualToString:@"Key"]) {
        id parentItem = [outlineView parentForItem:item] ? [outlineView parentForItem:item] : root;

        return [[parentItem allKeysForObject:item] objectAtIndex:0];
    } else {
        if ([item isKindOfClass:[NSString class]]) {
            return item;
        } else if ([item isKindOfClass:[NSDictionary class]]) {
            return @"";
        } else {
            return nil;
        }
    }
}

Он работает так, как должен, за исключением случаев, когда значения полей имеют одно и то же строковое значение. В качестве ключа всегда отображается первый элемент с этим значением, поэтому одно и то же значение ключа будет отображаться для всех одинаковых значений значений. Кто-нибудь знает, как решить эту проблему?


person Community    schedule 22.11.2009    source источник


Ответы (1)


Похоже, вы показываете дерево словарей, объектами которого являются либо строки, либо словари.

Первая проблема заключается в том, что каждый объект элемента должен однозначно идентифицировать строку. Ни ключ, ни значение не имеют этого свойства. (Ключ был бы, если бы это было плоское табличное представление, но это схематическое представление, и два словаря — один потомок, одноуровневый или двоюродный брат другого — могут иметь один и тот же ключ.) Вместо этого вы должны создать объект модели. для каждой пары ключ-значение.

Во-вторых, строки словарного значения должны быть элементами группы. Для этого можно реализовать метод делегата.

person Peter Hosey    schedule 23.11.2009
comment
Хм... Я потерял несколько часов из-за этой ловушки. В документе не было сообщения об ошибке или упоминания. Возможно, вы могли бы сообщить мне, почему эти детали отсутствуют в справочной документации? - person eonil; 27.11.2011
comment
@Eonil: я не работаю в Apple, поэтому ничего не могу сказать вам почему в документации. Что еще более важно, это задокументировано как в ссылке: developer.apple.com/library/mac/documentation/Cocoa/Reference/ и в руководстве: developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ Ссылка гласит: «Каждый элемент в представление контура должно быть уникальным», и формулировка руководства аналогична. - person Peter Hosey; 27.11.2011
comment
Я признателен за ссылку! Это мне очень помогает :) - person eonil; 28.11.2011