Допустим, у меня есть представление myView, контроллер представления myViewController и какой-то объект модели myModel. Кроме того, допустим, модель имеет два свойства, совместимых с KVO, arrayOfPeopleNames и arrayOfAnimalKinds (оба NSStrings).
На мой взгляд, я хочу, чтобы два всплывающих окна были привязаны к содержимому этих двух массивов.
Мой вопрос в том, что если myController имеет ссылку на myModel, а раскрывающийся список привязан к myViewController, рекомендуется ли устанавливать путь для ключей по строкам myModel.arrayOfPeopleNames?
Или мне нужно настроить дополнительный массив NSArray в myViewController, который отражает тот, что указан в myModel, и вместо этого привязать его к этому ключевому пути?
Первое кажется намного проще с точки зрения реализации (мне не нужно заставлять массив контроллеров зеркально отображать массив модели), но мне интересно, сильно ли он открывает модель для представления.
Мнения?





Вы не должны зеркалировать массив модели в контроллере. Хотя я бы не слишком беспокоился о привязке непосредственно к массиву модели в очень простом случае, вы также можете привязать свои объекты пользовательского интерфейса к NSArrayController, который управляет массивом модели. Это обеспечит разделение модели и пользовательского интерфейса и, что более важно, позволит обрабатывать такие задачи, как сортировка, выбор, добавление и удаление объектов и т. д.
Я могу понять, откуда вы пришли, потому что обеспокоены тем, что KVO и привязки нарушают "чистый" дизайн контроллера представления модели, но вам не о чем беспокоиться. Несмотря на то, что уведомления KVO передаются непосредственно в представление из модели, настройка и изменение соединения между представлением и моделью по-прежнему является обязанностью контроллера (только в этом случае это делается через IB). Например, вы не хотите, чтобы объект модели получал ссылку на представление и привязывался к пользовательскому интерфейсу, за это отвечает контроллер.
В качестве еще одного примера того, чего следует избегать, рассмотрим, если бы вместо имен в вашей модели был массив «идентификаторов животных». Вместо того, чтобы создавать метод для преобразования идентификаторов животных в понятные человеку имена животных в модели, вы можете вместо этого создать преобразователь значений или форматировщик для выполнения преобразования. Это позволяет поддерживать такой уровень разделения между моделью и видом.
Помните также, что цель шаблонов проектирования - уменьшить сложность кодирования решения проблемы, а не увеличить ее. Вы увидите, что именно так работает Cocoa, даже если он не всегда может придерживаться самого строгого определения шаблона.
Спасибо, Марк, в этом есть большой смысл. Я ценю все вопросы, на которые вы давали мне ответы в последнее время :).