2

У меня возникли проблемы с преобразованием моего проекта Cocoa из модели с ручной синхронизацией в модель привязки, так что мне не нужно беспокоиться о коде интерфейса.Проблема связывания какао; таблицы столбцов не отображаются, ошибки в консоли

Я следил за CocoaDevCentral Cocoa Bindings tutorial, чтобы убедиться, что я накрыл все базы, но все работает неправильно. У меня есть интерфейс master-detail, но у меня возникают проблемы даже с правильной работой основной части интерфейса. В главном столбце не отображаются данные, хотя я установил модель привязок, аналогичную тому, как она показана в учебнике. Я убедился, что все мои контроллеры и объекты имеют методы -(id)key и -(void)setKey:(id)key, так что они совместимы с привязками, я создал объект ControllerAlias ​​в своем nib, связал его с моим контроллером, создал NSArrayController, который связывается с одним из NSMutableArrays из класса, к которому подключается ControllerAlias, обязательно установил тип объектов, которые содержатся в массиве, а затем привязал столбец таблицы к NSArrayController.

Я не получаю никаких ошибок в Консоле, а установка NSBindingDebugLogLevel на 1 тоже не вызывает ошибок, что поможет мне разобраться в проблеме.

Единственное, что я мог придумать, чтобы убедиться, что все работает правильно, - проверить, что NSMutableArray, который подключается к NSArrayController, фактически имеет что-то в нем, и это так.

Любые предложения? Какие еще типичные подводные камни существуют с привязками какао, которые я должен проверить?

ответ

1

Вы поставили точку останова в свой ключ: метод, чтобы определить, вызвано ли это вызовом или нет? Если это не так, это указывает на то, что что-то неправильно настроено для привязки в столбце таблицы (поскольку вы подтвердили, что в вашем массиве есть элементы).

Я не думаю, что вам нужно создать контроллер объекта больше (этот учебник немного устарел). Просто создайте объект в своем NIB и установите его класс в свой класс Controller. Вы можете настроить привязки непосредственно через него, а не ObjectController.

Чтобы установить привязку, я следующее:

  1. Создать экземпляр моего контроллера в СИБ.
  2. Создайте NSArrayController, привяжите его к массиву в моем контроллере.
  3. Для каждого столбца таблицы привяжите значение к элементу объекта в контроллере массива.

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

0

Я создал объект ControllerAlias ​​в моей кончика пера,

Что такое «контроллер псевдоним»? Является ли это моделью, контроллером или представлением?

связать его с моим контроллером,

Что вы имеете в виду?

создал NSArrayController, который связывается с одним из NSMutableArrays из класса, который подключается к ControllerAlias,

Классы не имеют NSMutableArray с.

Какое свойство контроллера массива вы связали?

С каким объектом вы связались?

Какую ключевую дорожку этого объекта вы связали?

... а затем я связал столбец таблицы с NSArrayController.

Какое свойство столбца таблицы вы связали?

Какое свойство (путь ключа) контроллера массива вы связали?

0

Итак, в моем исходном коде я модифицировал массив (который представлял NSArrayController) в awakeFromNib, а не в init, поэтому изменения не отражались в интерфейсе, так как я не изменял массив через метод наблюдения за ключом.

Я изменил код из

theArray = [[NSMutableArray alloc] init]; 
[theArray addObject:newThing]; 

к:

theArray = [[NSMutableArray alloc] init]; 
NSMutableArray *bindingsCompliantArray = [self mutableArrayValueForKey:@"things"]; 
[bindingsCompliantArray addObject:newThing]; 

Я думаю, что другое решение, чтобы сделать загрузку в - метод (ID) инициализации вместо - (пустоте) awakeFromNib, но для этого требовался больший рефакторинг, поэтому я этого не делал.

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

+0

Другой способ (лучше, на мой взгляд) было бы добавить аксессуар `-addThingsObject:` (при условии, что ваше свойство называется «вещи»). Затем ваш код в `-awakeFromNib` является` [self addThingsObject: newThing]; `. – 2008-11-09 06:08:44