Много случаев Switch в cellForRowAtIndexPath
У меня вопрос по настройке табличного представления с жестко закодированными данными. Иногда разработчик сталкивается с ситуацией, когда вам нужно отобразить данные, которые получены не из слоя DATA MODEL, а хранятся в виде жестко закодированной информации.
Что я имею в виду Например, когда вы строите экран настроек, может быть такой UITableViewCell, как:
CustomTableViewCellName - данные конфигурации: имя / фамилия заполнителя, значок.
CustomTableViewCellPhone - Данные конфигурации: заполнитель телефона, значок.
CustomTableViewCellLogout - данные конфигурации: текст для выхода / выхода из системы, значок.
Давайте предположим, что у меня есть 3 раздела табличного представления, и каждый раздел содержит 5 разных ячеек, которые я описал выше в качестве примера разных случаев.
если мы будем реализовывать все эти клетки в
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
switch (indexPath.section)
..... A LOT OF CASES THAT CONFIGURE EACH CUSTOM CELLS
Как вы видите, в DATA MODEL нет только заполнителей и изображений значков, которые будут храниться в UITableViewCell в качестве данных по умолчанию для меток, представлений изображений textviews и т. Д. Я не говорю о модели здесь как о модели USER, например, которая хранит пользователя имя, фамилия и т. д. Я имею в виду, что мне нужно где-то хранить данные по умолчанию, может быть, в словаре. На самом деле заполнитель - это просто заполнитель, хотя у него есть ТЕКСТ, а ТЕКСТ - это данные =)
В этом случае у нас есть данные для настройки состояния представлений по умолчанию и данные, которые будут использоваться, например, в качестве модели USER.
Что меня беспокоит, так это то, что у меня будет большой коммутатор и очень массивный контроллер.
Я хотел бы создать несколько методов, которые будут представлять разделы с переключателем, используя indexPath.row в них:
- (UITableViewCell *)cellsForSection1:(NSIndexPath *)ip
- (UITableViewCell *)cellsForSection2:(NSIndexPath *)ip
- (UITableViewCell *)cellsForSection2:(NSIndexPath *)ip
и перенести эти методы в Interactor, который вернет мне ячейку. Я знаю, что Interactor должен подготовить только данные и передать их поверх Presenter для View.
Может быть, я задумался над проблемой. Я просто не хочу иметь большой переключатель в VC =) Я понимаю, что нет правильного решения. Но, возможно, кто-то сталкивался с этим.
Еще раз в моем случае данные - это ячейки по умолчанию, которые я хочу где-то настроить, чтобы предотвратить перегрузку контроллера представления. Да, может быть, это выглядит безумно, что ячейки - это данные, но посмотрите на View Controller, который содержит 1000 строк кода для конфигурации cellForRowAtIndexPath
тоже сумасшедший =)
3 ответа
Если ваши данные статичны, то вместо случаев переключения я предпочитаю использовать перечисления. Используйте Enums и в его теле присвойте тег каждому вашему разделу, а затем в cellForRowAtIndexpath перечислите этот Enum и соответственно отобразите ваши данные.
Подумайте о создании отдельного класса, который будет выступать в качестве источника данных табличного представления, а затем создайте экземпляр экземпляра контроллера представления. Таким образом, вы избегаете слишком большого класса VC, и ваш код легче тестируется модулем.
switch(model.id)
case cellKind1:
cell = [tableview dequeue..];
//do
cell.data = model
//don't do like this
cell.title = model.title;
cell.abc = model.abc