Изменение objectValue NSTableCellView в NSOutlineView на основе представления не распространяется на источник данных

Я использую NSOutlineView на основе представления для отображения и выбора иерархически структурированных элементов для научного приложения.

NSOutlineView на основе представления

Каждая строка в столбце схемы представляет элемент, обозначенный значком для конкретного элемента (все одинаковые на рисунке), флажком, показывающим, выбран ли элемент, и именем элемента. Мне нужно, чтобы значок, флажок и имя отображались в одной ячейке, поэтому я использую NSOutlineView на основе представления.

Я реализовал протокол NSOutlineViewDataSource для предоставления данных в представление схемы.

Метод outlineView:objectValueForTableColumn:byItem: предоставляет пользовательский объект со свойствами BOOL selected и NSString *name.

Мой пользовательский вид ячейки таблицы в IB составлен следующим образом:

представление NSOutlineView в IB

Я привязал значение флажка к objectValue.selected, а значение метки к objectValue.name.

Как я и надеялся, в представлении структуры хорошо отображаются имя и состояние выбора, предоставляемые objectValue.

Однако, если я изменю состояние флажка, метод outlineView:setObjectValue:forTableColumn:byItem:, определенный в протоколе NSOutlineViewDataSource, не будет запущен в моем источнике данных для предоставления вновь измененного значения объекта. Обратите внимание, что если я не использую пользовательский вид для ячейки, это работает.

Я проверил, действительно ли представление objectValue.selected ячейки таблицы изменяется при установке флажка, вставив оператор NSLog в метод setSelected объекта, который передается как objectValue. Элемент selected корректно изменяет состояние.

Как передать изменение objectValue обратно в модель моего источника данных? Я проверил методы делегата NSOutlineView, но не могу найти способ сообщить, что объектное значение представления ячейки было изменено с помощью моего флажка (т. е. что представление ячейки «закончило редактирование»). Есть ли какой-то другой фундаментальный момент, который мне не хватает?


person timo    schedule 07.11.2011    source источник
comment
Я заметил, что вы работаете с методами источника данных, но также использовали слово «связанный». Вы используете Cocoa Bindings? Если да, то как именно вы привязываете флажок к этому объекту?   -  person paulmelnikow    schedule 23.02.2012
comment
Кроме того, правильно ли я понимаю, что outlineView:objectValueForTableColumn:byItem: возвращает указатель на объект вашей модели? Я предлагаю проверить, вызывается ли на нем -copyWithZone:. Если это так, представление создает второй экземпляр объекта модели, что может помочь объяснить, почему изменение флажка не распространяется обратно на исходный экземпляр объекта модели.   -  person paulmelnikow    schedule 23.02.2012
comment
Вы поняли это? У меня такая же проблема.   -  person pickwick    schedule 15.03.2012


Ответы (2)


setObjectValue не работает для представлений:

из заголовка::

/* View Based OutlineView: This method is not applicable.
 */
- (void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;
person Daij-Djan    schedule 11.11.2012

Я смог решить эту проблему, создав подкласс NSTableCellView, сделав его делегатом содержащегося NXTextField и используя отредактированное значение для обновления значения объекта NSTableCellView.

class CategoryNameTableViewCell : NSTableCellView, NSTextFieldDelegate {

    func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
        guard var category = self.objectValue as! Category? else {
            Swift.print("Tried to edit category cell with no object!")
            return false
        }
        category.name = control.stringValue
        category.saveChanges()
        return true
    }

}
person Doug Knowles    schedule 16.05.2017