Реализация контроллера представления, который может обрабатывать два разных типа представления - PullRequest
2 голосов
/ 16 марта 2011

Извините, если название звучит запутанно, но я не смог придумать ничего лучшего.

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

Вот что я сделал: у меня есть собственный класс представления, который содержит UIScrollView и имеет два открытых свойства: dataSource и delegate.Объект источника данных должен соответствовать протоколу, который я определил;возвращает количество изображений и сами изображения.Делегат получает уведомление при изменении выбранной страницы.

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

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

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

Надеюсь, это не слишком запутанно, и мой подход не слишком ошибочен.Спасибо.

Ответы [ 2 ]

1 голос
/ 16 марта 2011

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

Ключевой идеей модели Model-View-Controller является то, что представления логически отделены от модели данных. Модель должна быть реальным ядром программы и предоставлять данные для всех представлений через контроллеры. Если вы правильно реализовали дизайн, у вас не будет большого количества настроек и небольшого дублирования кода, потому что модель будет поддерживать каждое возможное представление с чередованием.

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

В вашем случае это выглядит как объект источника данных взаимодействует с вашей моделью (как это делает объект UITableViewDataSource), и, поскольку оба представления используют одну и ту же логику, вы можете использовать один и тот же делегат для обоих представлений, если вы определите соответствующий протокол. Каждое представление будет нуждаться в собственном делегате для настройки, но это является частью шаблона проектирования Делегата, который вы должны использовать.

1 голос
/ 16 марта 2011

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

Это звучит как достойный подход.

Вы также можете просто реализовать один контроллер представления, который управляет обоими типами представления, создавая правильный вид на-спрос в loadView.

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