Понимание Model-View-Controller - PullRequest
13 голосов
/ 24 марта 2011

У меня есть приложение, в котором я хочу иметь одно «фоновое» представление (представление контроллера представления), и, кроме того, несколько UIView s, которые рисуют себя как круги.Я просто не понимаю, как реализовать все это, все еще придерживаясь MVC ...

Модель и представление должны отличаться.Означает ли это, что мне обычно нужен один набор заголовочных файлов и файлов реализации для представления и другой (отдельный) набор для модели - даже если мой объект просто класс Circle?Или, если бы у меня были установлены один Circle.h и Circle.m, а затем внутри файла заголовка было бы два интерфейсных блока, один для модели и один для вида, и два блока реализации (опять же, один для модели и один дляпредставление)?

Я видел, как несколько человек рекомендуют использовать контроллер представления для обработки всех представлений в loadView и во избежание создания отдельных пользовательских объектов представления;Означает ли это, что я не должен создавать отдельный набор файлов .h и .m для представления?Последнее кажется мне гораздо более организованным с точки зрения дизайна.

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

Я думал о том, чтобы использовать указатель на объект модели внутри представления и KVOing от представления к модели - но тогда он не проходит через контроллер и, таким образом, вообще нарушает MVC, верно?

Заранее спасибо.

Ответы [ 2 ]

23 голосов
/ 24 марта 2011

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

Трудно сказать, как применить MVC к вашему приложению, потому что вы еще не сказали нам, что это за приложениедолжен делать , а также это не похоже на реалистичное приложение.Поэтому я сделаю все возможное, и сделаю некоторые предположения по пути.Приложение, которое просто рисует несколько кругов в фиксированных местах на фоне, не очень интересно - это могут быть практически все виды, и вообще не требуется контроллер.Допустим, все круги движутся в разных направлениях, рисуются разными цветами и со временем меняются в размерах.Теперь вы начинаете нуждаться в модели, чтобы вы могли отслеживать данные, которые представляют эти круги, и в контроллере для преобразования модели в термины, которые могут быть представлены представлениями.

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

Мы не знаем, что представляют эти круги, но это не очень веселоесли они не представляют что-то, давайте постулируем, что задача приложения - помочь нам сравнить корпорации.У нас есть данные о доходах, рыночной капитализации, количестве сотрудников, кредитном рейтинге, имени, тикере и т. Д. Вы можете создать пользовательский объект для хранения всех данных для каждой корпорации или поместить их в словарь.Наша модель представляет собой набор этих пользовательских объектов или словарей.

Обратите внимание, что представления кругов ничего не знают о корпорациях, а модель ничего не знает о кругах.Это хорошая вещь.Это также место, где входит контроллер. Контроллер - это то место, куда вы помещаете код, который выражает модель визуально с использованием представлений.Он также интерпретирует события из представлений, обновляя модель по мере необходимости.Итак, наш контроллер знает как о деталях корпораций, так и о свойствах представления круга.Это создает круговое представление для каждой корпорации в модели.Я хочу, чтобы площадь круга соответствовала рыночной капитализации корпорации, вертикальной позиции для представления выручки и горизонтальной позиции для обозначения количества сотрудников.Мы назначим цвет на основе кредитного рейтинга корпорации.Контроллер должен, конечно, следить за всеми видами кругов и каким-либо способом сопоставлять виды кругов и корпорации.

Теперь у вас есть кое-что.Это все еще довольно простое приложение, но у вас есть полезная диаграмма, сравнивающая корпорации в нескольких измерениях.Давайте улучшим его.

Во-первых, трудно понять, какой круг представляет какую корпорацию.Было бы неплохо, если бы круговой вид мог отображать текст.Давайте добавим свойства title и subtitle и изменим -drawRect: чтобы нарисовать эти строки выше и ниже круга соответственно.Мы также изменим контроллер так, чтобы касание или щелчок по кругу устанавливали заголовок и подзаголовок этого круга на имя корпорации и символ тикера, или очищали их, если они были установлены ранее.

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

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

Я уверен, что гипотетическое приложение в этом очень многословном объяснении на примере имеет примерно нулевое сходство ссобственное приложение, но, возможно, это поможет объяснить, почему MVC полезен, и проинструктировать структуру вашего собственного приложения.Удачи.

4 голосов
/ 27 октября 2013

Я получил хорошее объяснение от разработки приложения для телефона CS193P (зима 2013).

Model-View-контроллер:

Разделите все объекты на три лагеря:

enter image description here

Модель: Что такое ваше приложение (карта, колода, логика карточной игры)
Контроллер: Как ваша модель представлена ​​пользователю (UI Logic). Контроллер знает все об интерфейсе пользователя.
Вид: миньонов вашего контроллера .

Как эти лагеря общаются:

enter image description here

Не пересекайте желтую линию.
Вы можете пересечь пунктирную белую линию.
Есть некоторые специальные правила для пересечения сплошной белой линии.

enter image description here

Контроллер -> Вид (через Выход )
Вид -> Контроллер (через Источник данных (количество, данные в Att), делегат (будет, должен, сделал), Целевое действие )
Модель -> Контроллер (через Уведомление & Наблюдение значения ключа )

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