@zzasdee

Как реализовать одинаковые методы, работая с tableView в UITableViewController и UIViewController?

Такой вопрос уже поднимался ( Как избежать дублирование кода в двух базовых классах унаследованных от UIViewController и UITableViewController? ), но было это много времени назад и я решил не поднимать старый топик.

У меня в проекте есть много разных вьюконтроллеров, я предпочитаю использовать их, нежели UITableViewController.
В корневом для моих вьюконтроллеров сабклассе (пускай это будет BaseViewController : UIViewController) есть обычная @property UITableVIew *tableView. Также есть метод для обработки появления клавиатуры KeyboardWillShow/KeyboardWillHide и всякие другие методы, где я иногда использую tableView.
Всё хорошо до тех пор, пока не приходится использовать статичные ячейки в таблице. Тогда возникает вопрос, как унаследовать всё то, что у меня было наработано в BaseViewController? Резонное замечание: вывести всё это дело в категорию, для UIViewController, но там выходит конфликт имён tableView для UITableViewController.
В общем, как вы решаете этот вопрос?
  • Вопрос задан
  • 196 просмотров
Пригласить эксперта
Ответы на вопрос 2
ManWithBear
@ManWithBear
Swift Adept, Prague
Не использую tableviewcontroller потому что незачем. Статичные таблицы решаются статичным кодом.
Ответ написан
Flanker_4
@Flanker_4
Соглашусь, что UITableViewController лучше не использовать вовсе. Но и Вас я могу понять, хочется быстро накидать экран в сторибоарде и не заморачиваться. Вот какие решения я использовал:
1) для новых приложений ( >= iOS 9) Использовать UIStackView. Идеально подходит для подобного рода задач и не требует лишних телодвижений, что требует uitableview
2) Использование нового подхода, так продвигаемого Apple в swift вместо ООП - протокольно ориентированное программирование.
Объявляете свой протокол для работы с tableView, где объявляете readonly property NSArray *tableViews (кто сказал что на контроллере может быть только одна таблица ;) ), ну или на худой конец myTableView

Объявляете свою категорию/extension в терминологии swift (а лучше их набор) на UIViewController, где используется вышеуказанный протокол и вышеуказанная property.
Дальше в UITableViewController реализовываете этот протокол

- (NSArray <UITableView*> *) tableViews{
    return @[self.tableView];
}

аналогично делаете в своем базовом BaseViewController (а нужен ли он теперь вообще? подумайте. хотя лучше оставить, но он по идее теперь станет максимально пустым)
Ну и в viewDidLoad/init вызываете нужные методы из категорий для инициализации
Получилось сумбурно, но я надеюсь Вы уловили месседж
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы