Базовая привязка данных и какао

Изменения, внесенные в значения свойств объектов, должны быть распространены к пользовательскому интерфейсу, и элементы пользовательского интерфейса, выводящие на экран то же свойство, должны быть сохранены синхронизируемыми. Привязка какао обеспечивает уровень управления для Какао, но, тогда как Базовая платформа Данных фокусируется на модели, внимании привязки Какао на пользовательский интерфейс. Во многих ситуациях привязка Какао упрощает сохранять пользовательский интерфейс, должным образом синхронизировался. Базовая платформа Данных разработана, чтобы взаимодействовать беспрепятственно с и улучшить утилиту, привязка Какао.

Привязка какао и Базовые Данные являются в основном ортогональными. В целом привязка Какао работает точно таким же образом с управляемыми объектами как с другими объектами модели Какао. Можно также использовать те же объекты предиката и дескрипторы вида, как Вы используете для выборки объектов от персистентного хранилища, чтобы отфильтровать и сортировать объекты в памяти — например, для представления в табличном представлении. Это дает Вам непротиворечивый набор API для использования всюду по приложению. Там, однако, несколько (обычно самоочевидных) различий в конфигурации и работе.

В дополнение к проблемам, описанным в этой статье, существует несколько других областей, где взаимодействие между Базовой Привязкой Данных и Какао может вызвать проблемы; они описаны в Поиске и устранении неисправностей Базовых Данных в частности:

По модулю эти исключения, все, что обсуждено и описано в Привязке Какао, Программируя Темы, применяется одинаково к Базовым Основанным на данных приложениям, и необходимо использовать те же методы для конфигурирования и отладки привязки при использовании Базовых Данных, как Вы были бы, если Вы не использовали Базовые Данные.

Дополнения к контроллерам

Основная область, где Базовые Данные добавляют к привязке Какао, находится в конфигурации объектов контроллера такой как NSObjectController и NSArrayController. Базовые Данные добавляют следующие опции к тем классам:

Автоматически подготавливает флаг содержания

Если «автоматически подготавливает содержание» флаг (см., например, setAutomaticallyPreparesContent:) установлен для контроллера, начальное содержание контроллера выбирается от его контекста управляемого объекта с помощью текущего предиката выборки контроллера. Важно отметить, что выборка контроллера выполняется как задержанная работа, выполняемая после того, как ее контекст управляемого объекта установлен (загрузкой пера) — это поэтому происходит после awakeFromNib и windowControllerDidLoadNib:. Это может создать проблему, если Вы хотите выполнить работу с содержанием объектного контроллера в любом из этих методов, так как содержание контроллера nil. Можно работать вокруг этого путем выполнения выборки «вручную» с fetchWithRequest:merge:error:. Вы передаете nil как параметр запроса выборки для использования запроса по умолчанию, как проиллюстрировано в следующем фрагменте кода.

- (void)windowControllerDidLoadNib:(NSWindowController *) windowController
{
    [super windowControllerDidLoadNib:windowController];
 
    NSError *error = nil;
    BOOL ok = [arrayController fetchWithRequest:nil merge:NO error:&error];
    // ...

Наследование объекта

Если Вы указываете супер объект как объект для запроса выборки, возвраты выборки, соответствующие экземпляры объекта и подобъектов (см. Наследование Выборки и Объекта). Как заключение, если Вы указываете супер объект как объект для контроллера, он выбирает соответствие экземпляров объекта и любых подобъектов. При указании абстрактного суперобъекта контроллер выбирает соответствие экземпляров конкретных подобъектов.

Предикат фильтра для к - многие отношение

Иногда можно хотеть установить предикат фильтра для поля поиска, позволяющего пользователю отфильтровать содержание контроллера массива на основе места назначения к - многие отношение. Если Вы хотите искать на - многие отношение, необходимо использовать ANY или ALL в предикате. Например, если Вы хотите выбрать Отделы, в которых у по крайней мере одного из сотрудников есть имя «Мэтью», Вы используете ANY оператор как показано в следующем примере:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"ANY employees.firstName like 'Matthew'"];

Вы используете тот же синтаксис в привязке предиката поля поиска:

ANY employees.firstName like $value

Вещи более сложны, однако, если Вы хотите соответствовать префикс и/или суффикс — например, если Вы хотите искать Отделы, в которых у по крайней мере одного из сотрудников есть «Матовое» имя, «Мэтью», «Мэтти» или любое другое имя, начинающееся «Матового». Существенно просто необходимо добавить подстановочный знак, соответствующий:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"ANY employees.firstName like 'Matt*'"];

Вы не можете, тем не менее, использовать тот же синтаксис в привязке предиката поля поиска:

// does not work
ANY employees.firstName like '$value*'

Причины этого описаны в Руководстве по программированию Предиката — помещающие кавычки в формате предиката предотвращают подстановку переменных. Вместо этого необходимо использовать, заменяют любыми подстановочными знаками сначала, как проиллюстрировано в этом примере:

NSString *value = @"Matt";
NSString *wildcardedString = [NSString stringWithFormat:@"%@*", value];
[[NSPredicate predicateWithFormat:@"ANY employees.firstName like %@", wildcardedString];

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