Привязка к базе данных NSOutlineView с привязкой к основным данным
Я пытаюсь реализовать новый OutlineView на основе представлений в качестве исходного списка в приложении для Mac. Однако я не могу получить значения для отображения, поэтому я сделал небольшое тестовое приложение из шаблона приложения Core Data и не могу заставить его работать прямо там.
Я определил два простых класса в моей модели данных; позвольте назвать их "Родитель" и "Ребенок". Родитель имеет один атрибут, "имя" и одно отношение "дети". имя является необязательной строкой, а children является необязательным отношением to-many к Child. Ребенок имеет тот же атрибут "имя" и взаимное отношение "родитель", которое является инверсией детей. Я создал пользовательские классы для обоих из них и написал заглушку в Ребенке для детей, который возвращает nil
.
Я перетащил список источников из библиотеки объектов в свой XIB и упал в контроллер дерева. Контроллер дерева Дети. Путь к ключу установлен на "дети", он находится в режиме имени сущности, с именем "Родитель" в качестве имени объекта, "Готовый контент", а его Контекст управляемого объекта установлен в контекст делегирования приложения, Контроллер дерева является источником данных в виде контура, и я привязал отображение текста ячейки данных к представлению ячеек таблицы с ключом "objectValue.name".
in -applicationDidFinishLaunching:
Я создаю два экземпляра Родительский, один с Ребенок, и назначьте свойство имя для каждого объекта. p >
Актуальная проблема
![No text]()
Теперь, с этой настройкой, я получаю строки, отображаемые в исходном списке, но текстовые поля пустые, хотя они связаны. Я не думаю, что мне нужно что-то делать, поскольку я использую привязки, и я уверен, что привязка к свойству objectValue
правильная. Что не так?
Я могу предоставить более подробную информацию, если это необходимо, но я уверен, что покрывает все, что я сделал.
Ответы
Ответ 1
Ничего себе, мне, как мне две недели назад, задают этот вопрос.
В любом случае, если вы похожи на меня, проблема в том, что,
для NSOutlineViews
на основе представления вам необходимо реализовать
- (NSView *)outlineView:(NSOutlineView *)outlineView
viewForTableColumn:(NSTableColumn *)tableColumn
item:(id)item;
делегировать метод и вернуть NSTableCellView
, который вы создали,
или они просто дадут вам пустую строку. Самый простой способ сделать это - просто позвонить
[outlineView makeViewWithIdentifier:@"MyCell" owner:self]
заменив MyCell
на то, что вы набрали как "Идентификатор элемента пользовательского интерфейса"
в Identity Inspector для вашего NSTableCellView
.
Ответ 2
Как отметил Боаз выше, вам нужно реализовать метод Delegate, чтобы вернуть представление. Довольно загадка, учитывая, что я не мог найти этот метод в Документах.
Что касается типа параметра (id), то это NSTreeControllerTreeNode, который является недокументированным подклассом NSTreeNode. Если вы его произнесете, вы можете получить объект ячейки и вернуть другой вид, основанный на том, какой тип объекта или какие атрибуты этого объекта определяют тип представления ячейки. например
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
NSTableCellView *view = nil;
NSTreeNode *node = item;
if ([node.representedObject isKindOfClass:[Group class]]) {
view = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];
} else {
view = [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
}
return view;
}
Ответ 3
Это оказалось изменением для Xcode 4 или около того. Конструктор интерфейса добавляет два объекта NSTableCellView в NSOutlineView. Если вы удалите объекты NSTableCellView, которые вы вернетесь в более зрелый (или, по крайней мере, документированный) мир, в котором вам нужно было бы реализовать
outlineView: dataCellForTableColumn: элемент и outlineView: willDisplayCell: forTableColumn: item
... или, по крайней мере, вы делаете, если хотите посмотреть исходный список. В любом случае, это то, как устанавливается образец SourceView, и поэтому, когда вы пытаетесь воссоздать образец SourceView, который вы можете получить в таком беспорядке.
В качестве альтернативы, если вы хотите продолжать использовать объекты NSTableCellView (которые весьма полезны), вы можете:
-
свяжите содержимое NSOutlineView 'с вашим TreeController.arrangedObjects
-
привязать NSTextField (и/или NSImageView) под NSTableCellView к "представлению ячеек таблицы" с помощью пути ключа модели объекта. key >
Ответ 4
Я создал небольшой примерный проект, который popuplates также popuplates NSOutlineView
, а не CoreData, но решающим фактором является то, что @boaz-stuller заявил, что выбрана правильная ячейка (аналогично тому, как вы обрабатываете UITableViewCell
в IOS.
Итак, мой случай Я реализовал метод следующим образом:
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
if ([self isHeader:item]) {
return [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];
} else {
return [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
}
}
Отметьте besi/mac-quickies в github.
Большая часть материала либо выполняется в IB, либо может быть найдена в AppDelegate
![screenshot]()