Подтвердить что ты не робот

Привязка к базе данных NSOutlineView с привязкой к основным данным

Я пытаюсь реализовать новый OutlineView на основе представлений в качестве исходного списка в приложении для Mac. Однако я не могу получить значения для отображения, поэтому я сделал небольшое тестовое приложение из шаблона приложения Core Data и не могу заставить его работать прямо там.

Я определил два простых класса в моей модели данных; позвольте назвать их "Родитель" и "Ребенок". Родитель имеет один атрибут, "имя" и одно отношение "дети". имя является необязательной строкой, а children является необязательным отношением to-many к Child. Ребенок имеет тот же атрибут "имя" и взаимное отношение "родитель", которое является инверсией детей. Я создал пользовательские классы для обоих из них и написал заглушку в Ребенке для детей, который возвращает nil.

Я перетащил список источников из библиотеки объектов в свой XIB и упал в контроллер дерева. Контроллер дерева Дети. Путь к ключу установлен на "дети", он находится в режиме имени сущности, с именем "Родитель" в качестве имени объекта, "Готовый контент", а его Контекст управляемого объекта установлен в контекст делегирования приложения, Контроллер дерева является источником данных в виде контура, и я привязал отображение текста ячейки данных к представлению ячеек таблицы с ключом "objectValue.name".

in -applicationDidFinishLaunching: Я создаю два экземпляра Родительский, один с Ребенок, и назначьте свойство имя для каждого объекта. p >

Актуальная проблема

No text

Теперь, с этой настройкой, я получаю строки, отображаемые в исходном списке, но текстовые поля пустые, хотя они связаны. Я не думаю, что мне нужно что-то делать, поскольку я использую привязки, и я уверен, что привязка к свойству objectValue правильная. Что не так?

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

4b9b3361

Ответ 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