Изменение objectValue NSTableCellView в NSOutlineView на основе представления не распространяется на dataSource - PullRequest
5 голосов
/ 07 ноября 2011

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

view-based NSOutlineView

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

Я реализовал протокол NSOutlineViewDataSource для подачи данных в контурный вид.

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

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

view-based NSOutlineView in IB

Я установил значение флажка на objectValue.selected, а значение метки на objectValue.name.

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 11 ноября 2012

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

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

/* View Based OutlineView: This method is not applicable.
 */
- (void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;
0 голосов
/ 16 мая 2017

Я смог решить эту проблему, создав подкласс 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
    }

}
...