Я использую NSOutlineView
на основе представления для отображения и выбора иерархически структурированных элементов для научного приложения.
Каждая строка в столбце схемы представляет элемент, обозначенный значком для конкретного элемента (все одинаковые на рисунке), флажком, показывающим, выбран ли элемент, и именем элемента. Мне нужно, чтобы значок, флажок и имя отображались в одной ячейке, поэтому я использую NSOutlineView
на основе представления.
Я реализовал протокол NSOutlineViewDataSource
для предоставления данных в представление схемы.
Метод outlineView:objectValueForTableColumn:byItem:
предоставляет пользовательский объект со свойствами BOOL selected
и NSString *name
.
Мой пользовательский вид ячейки таблицы в IB составлен следующим образом:
Я привязал значение флажка к objectValue.selected
, а значение метки к objectValue.name
.
Как я и надеялся, в представлении структуры хорошо отображаются имя и состояние выбора, предоставляемые objectValue.
Однако, если я изменю состояние флажка, метод outlineView:setObjectValue:forTableColumn:byItem:
, определенный в протоколе NSOutlineViewDataSource, не будет запущен в моем источнике данных для предоставления вновь измененного значения объекта. Обратите внимание, что если я не использую пользовательский вид для ячейки, это работает.
Я проверил, действительно ли представление objectValue.selected
ячейки таблицы изменяется при установке флажка, вставив оператор NSLog в метод setSelected
объекта, который передается как objectValue
. Элемент selected
корректно изменяет состояние.
Как передать изменение objectValue
обратно в модель моего источника данных? Я проверил методы делегата NSOutlineView, но не могу найти способ сообщить, что объектное значение представления ячейки было изменено с помощью моего флажка (т. е. что представление ячейки «закончило редактирование»). Есть ли какой-то другой фундаментальный момент, который мне не хватает?
outlineView:objectValueForTableColumn:byItem:
возвращает указатель на объект вашей модели? Я предлагаю проверить, вызывается ли на нем-copyWithZone:
. Если это так, представление создает второй экземпляр объекта модели, что может помочь объяснить, почему изменение флажка не распространяется обратно на исходный экземпляр объекта модели. - person paulmelnikow   schedule 23.02.2012