2008-12-10 3 views
5

Допустим, у меня есть представление, myView, контроллер представлений, myViewController и какой-то модельный объект myModel. Далее, скажем, модель имеет два свойства, совместимые с KVO, arrayOfPeopleNames и arrayOfAnimalKinds (оба NSStrings).Вопрос о наилучших методах привязки MVC и какао

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

Мой вопрос в том, имеет ли myController ссылку на myModel, а выпадающий привязан к myViewController. Хорошая практика - установить путь по ключевому слову по линиям myModel.arrayOfPeopleNames?

Или мне нужно настроить дополнительный NSArray в myViewController, который отражает объект в myModel и привязывается к этой ключевой ссылке?

Первое кажется намного проще с точки зрения реализации (мне не нужно, чтобы массив контролеров отображал массив модели), но мне интересно, подвергает ли он модель большому взгляду.

Мнения?

ответ

8

Вы не должны отражать массив модели в контроллере. Хотя я не был бы слишком озабочен привязкой непосредственно к массиву модели в очень простом случае, вы могли бы также привязать ваши объекты пользовательского интерфейса к NSArrayController, который управляет массивом модели. Это обеспечило бы разделение между моделью и пользовательским интерфейсом и, что более важно, обрабатывать такие задачи, как сортировка, выбор, добавление и удаление объектов и т. Д.

Я вижу, откуда вы родом, будучи заинтересованным KVO, и привязки нарушают «чистый» дизайн контроллера модели, но вам не о чем беспокоиться. Несмотря на то, что уведомления KVO передаются непосредственно в представление из модели, настройка и изменение соединения между представлением и моделью все еще несут ответственность контроллера (только в этом случае это выполняется через IB). Например, вы не хотите, чтобы объект модели получал ссылку на представление и привязывался к пользовательскому интерфейсу, который был бы ответственностью контроллера.

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

Имейте в виду, что цель дизайна шаблонов - уменьшить сложность кодирования решения проблемы, а не увеличивать ее. Вы увидите, что именно так работает какао, хотя он может не всегда придерживаться строжайшего определения шаблона.

+0

Спасибо Marc, что имеет большой смысл. Я ценю все вопросы, которые вы вносили мне в ответ в последнее время :). –

+0

Я рад, что это помогло! –