Ответ 1
Связывание - это система для подключения ваших представлений к вашим контроллерам без написания большого количества кода клея, чтобы они явно говорили друг с другом. Все, что вам нужно сделать, это настроить свойства в обоих классах * и подключить привязку в IB.
Традиционный подход состоит в том, что в представлении есть один или несколько выходов, чтобы поговорить с контроллером (наиболее общие примеры - delegate
и target
), а контроллер имеет выходы для разговора с представлениями. Когда контроллер обновляет модель, он отправляет (например) [view modelChange:newModelObject]
. Когда представление хочет обновить модель, оно отправляет некоторое сообщение делегата своему делегату (контроллеру), например NSText textDidChange:
.
С помощью Bindings все, что вам нужно сделать в коде, - это реализовать свойства представления и свойств на контроллере, а затем выставить одно или несколько свойств представления как привязки *. Тогда вам нужно только привязать привязку. Если это класс Cocoa, это торт: просто установите его в IB. Если это собственный пользовательский класс, вы, вероятно, напишите сообщение bind:toObject:withKeyPath:options:
самостоятельно (не намного сложнее).
Позвольте мне повторить следующее: с помощью Bindings весь ваш код клея (большую часть времени) находится в контроллере [view bind:@"viewProperty" toObject:self withKeyPath:@"controllerProperty.modelProperty" options:options];
. Все остальное обрабатывается системами Bindings и KVO за кулисами и вашими аксессуарами свойств.
Недостатком является то, что вы должны строго соответствовать требованиям Cocoa Bindings. Они просты, но многие старые приложения разработаны таким образом, что не подходят для Cocoa Bindings.
- Вы должны создать реальные объекты модели, а не просто передавать примитивные объекты (например, массивы словарей). Если вы используете Core Data, это легко: ваши управляемые объекты являются объектами модели.
- Вы должны либо правильно записать своих аксессуаров, либо синтезировать правильные аксессоры. Например, свойство NSString всегда должно быть
@property(copy)
, never@property(retain)
(потому что в противном случае вы обнаружите, что сохраняете другую изменяемую строку, которую они потом будут мутировать, пока вы ее удерживаете). - Вы должны изменять свойства объектов модели по их свойствам (
model.foo = bar
) или сообщениям-аксессуарам ([model setFoo:bar]
), никогда не используя прямой доступ к переменной экземпляра. (Очевидное исключение для самих методов доступа, если вы сами написали, потому что они должны напрямую обращаться к переменной экземпляра.)
Есть два преимущества:
- Вы можете написать совершенно новый класс представления, не выбирая много кода клея. Больше всего вам нужно удалить несколько сообщений
bind::::
для старых свойств вида. Если через пару лет вы пройдете путь, вы решите, что ваш текущий вид просто не может масштабировать ваше приложение вперед, это дает вам гибкость, чтобы вырвать его и начать заново с минимальной болью. - Что еще более важно, чем меньше кода вы читаете, тем легче читать его.
* И, согласно документации, реализуйте ошибку документации.
Добавлено 2009-03-07: А, нашел цитату. "Подклассы NSView могут выставлять дополнительные свойства, совместимые с ключом-значением/ключ-значение-наблюдая, как привязки, вызывая метод класса exposeBinding: для каждого из свойств". - NSKeyValueBindingCreation Таким образом, вам не нужно использовать метод наблюдения KVO.