Что лучше всего описывает objective-C и привязки какао?

У меня проблемы с пониманием привязок какао. Может ли кто-нибудь объяснить мне, что это такое, понятным для человека способом?

Ответов (2)

Решение

Привязки - это система для подключения ваших представлений к вашим контроллерам без написания большого количества связующего кода, чтобы они явно общались друг с другом. Все, что вам нужно сделать, это настроить свойства в обоих классах * и подключить привязку в IB.

Традиционный подход заключается в том, что у представления есть один или несколько выходов для взаимодействия с контроллером (наиболее общие примеры: delegate и target ), а у контроллера есть выходы для взаимодействия с представлениями. Когда контроллер обновляет модель, он отправляет (например) [view modelChange:newModelObject] . Когда представление хочет обновить модель, оно отправляет своему делегату (контроллеру) какое-то сообщение делегата, такое как NSText textDidChange: .

С привязками все, что вам нужно сделать в коде, - это реализовать свойства в представлении и свойства на контроллере, а затем предоставить одно или несколько свойств представления как привязки *. Тогда вам останется только зацепить привязку. Если это класс Какао, это торт: просто настройте его в IB. Если это ваш собственный класс, вы, вероятно, bind:toObject:withKeyPath:options: сами напишете сообщение (не намного сложнее).

Позвольте мне повторить это: с Bindings весь ваш связующий код (большую часть времени) находится [view bind:@"viewProperty" toObject:self withKeyPath:@"controllerProperty.modelProperty" options:options]; в контроллере. Все остальное обрабатывается системами Bindings и KVO за кулисами, а также аксессуарами ваших свойств.

Недостатком является то, что вы должны строго соответствовать требованиям Cocoa Bindings. Это просто, но многие старые приложения разработаны таким образом, что не подходят для привязок какао.

  • Вы должны создавать объекты реальной модели, а не просто передавать примитивные объекты (например, массивы словарей). Если вы используете Core Data, это просто: ваши управляемые объекты являются объектами модели.
  • Вы должны либо правильно написать свои аксессоры, либо синтезировать правильные аксессоры. Например, свойство NSString должно быть всегда @property(copy), никогда @property(retain)(потому что в противном случае вы обнаружите, что сохраняете чью-то изменяемую строку, которую они затем будут видоизменять, пока вы ее удерживаете).
  • Вы должны только изменить свойства моделей объектов по их свойствам ( model.foo = bar) или аксессоры сообщений ( [model setFoo:bar]), никогда не путем прямого доступа к переменной экземпляра. (Очевидное исключение для самих методов доступа, если вы написали свои собственные, потому что они должны обращаться к переменной экземпляра напрямую.)

Есть два преимущества:

  • Вы можете написать совершенно новый класс представления без необходимости вырезать много связующего кода. Самое большее, что вам нужно будет удалить, это несколько bind::::сообщений для свойств старого представления. Если через пару лет вы решите, что ваше текущее представление просто не может масштабироваться в соответствии с будущими возможностями вашего приложения, это дает вам гибкость, чтобы вырвать его и начать заново с минимальными усилиями.
  • Что еще более важно, чем меньше кода вам придется читать, тем легче его читать.

* И, согласно документации, реализовать метод наблюдения KVO в классе представления, но на самом деле мне никогда не приходилось этого делать. Я зарегистрировал ошибку в документации .

Добавлено 2007-03-07: А, нашел цитату. «Подклассы NSView могут предоставлять дополнительные свойства, совместимые с кодированием значения ключа / наблюдением значения ключа, как привязки, вызывая метод класса exposeBinding: для каждого из свойств». - NSKeyValueBindingCreation Таким образом, вам не нужно реализовывать метод наблюдения KVO .

Предыдущий ответ очень исчерпывающий и хороший, я просто подумал, что добавлю ответ, объясняющий, что это за ядро, без конкретного использования Cocoa или Objective-C. Это связано с тем, что сама концепция не зависит от языка, хотя динамические языки, такие как Objective-C, делают ее намного проще, чем более статический язык, такой как C++.

Пример

Скажем , у вас есть два объекта M и V . У М есть методы:

setX(int x);
setY(int y);
int getX();
int getY();

Пока у V есть методы:

setA(int x);
setB(int y);
int getA();
int getB();

Один из способов взглянуть на это состоит в том, что M имеет свойства x и y, а V имеет свойства a и b . Вы хотите, чтобы изменение свойства x приводило к изменению свойства b, а изменение y - к изменению свойства a .

Под изменением свойства x мы подразумеваем, например:

M.setX(10)

где раньше

M.getX() != 10

Таким образом , мы хотим , чтобы вызов Setx на M , чтобы вызвать вызов множества А на V .

Что переплеты позволяют сказать, что свойство б на объект V связана с имущественным й на объект М . И тогда это обновление выполняется автоматически. Вы как кодер не должны кода записи , которая проверяет , если х изменяется , а затем вызвать SETB на V . Привязки позаботятся об этом автоматически.

Резюме

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