MVC и связь между ними. Что я упустил? - PullRequest
1 голос
/ 03 августа 2009

Привет всем, пытаюсь выучить цель-c. Все шло хорошо, пока я не понял, что мне не хватает ссылки.

Когда я строю в духе MVC, я понимаю, что вам никогда не следует разговаривать с Model и View.

У меня есть проблема, с которой я сейчас бездельничаю.

  • Модель, содержащая класс многоугольника. Содержит объект многоугольника с такие атрибуты, как numberOfSides.

  • Контроллер, читающий некоторый интерфейс элементы и модификации модели. За пример numberOfSides.

  • Вид, содержащий чертеж вида многоугольники.

Так вот, здесь возникла проблема. Представление нуждается в информации об объекте из модели. Как мне это получить? Я попробовал какой-нибудь IBOutlet, но так и не заработал.

Я закончил тем, что создал свойство для представления, которое могло бы содержать numberOfSides. Затем я бы использовал метод контроллера, который вызвал бы метод представления назад и установил бы numberOfSides.

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

Спасибо большое и спокойной ночи! :)

Ответы [ 4 ]

8 голосов
/ 03 августа 2009

MVC в Какао немного отличается от традиционного MVC, поэтому я отвечу способом Какао.

У вас есть объект контроллера, который имеет указатель на ваш объект Polygon. Ваш контроллер должен также иметь указатель на ваш вид (скорее всего, через IBOutlet). При изменении полигона (независимо от того, является ли числоOfSides или что-то еще), контроллер должен знать об этом и передавать информацию в представление. Аналогичным образом, если представлению разрешено изменять numberOfSides (скажем, у вас есть ползунок для увеличения количества сторон), тогда контроллер должен знать об этом изменении и передавать его объекту Polygon.

По сути, цель контроллера состоит в том, чтобы передавать информацию назад и вперед из представления в модель и следить за тем, чтобы они оставались синхронизированными.

1 голос
/ 04 августа 2009

Вы также можете предоставить своему представлению переменную экземпляра полигона, доступную только для чтения (просто указатель на ваш экземпляр полигона в контроллере; только для чтения, потому что вы не хотите, чтобы ваше представление могло изменять модель). Это не обязательно является нарушением принципов MVC.

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

Другой вариант - дать вашему представлению делегат (= ваш контроллер), а затем вызвать что-то вроде [делегат numberOfSidesToDraw] из класса представления.

Все три метода имеют свои плюсы и минусы.

1 голос
/ 03 августа 2009

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

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

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

0 голосов
/ 03 августа 2009

Я понимаю. Мой контроллер имеет IBOutlet для вида и многоугольника.

Я забыл упомянуть, что я использую CG и drawrect для рисования многоугольника.

То, что я хотел бы сделать, и что я должен делать, если я правильно понимаю, это то, что из контроллера передается число NumberOfSides в представление, прося его нарисовать с таким количеством сторон. Как:

[просмотр drawPolygon: myPolygon.numberOfSides];

Но то, что я должен сделать, потому что drawrect вызывается автоматически, это сделать некоторую переменную экземпляра представления доступной для содержания numberOfSides, которое установит контроллер. А затем вызовите [view setNeedsDisplay];

Имеет ли это смысл? Поскольку представление не может получить доступ к myPolygon напрямую. Как бы вы подошли к этому?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...