Базовый класс контроллера Common View
Я хотел бы иметь класс BaseViewController
(который наследует от UIViewController
) для моего проекта, который может выступать в качестве базового класса для других контроллеров представлений в моем проекте. Это должно добавить такие вещи, как общий прогресс HUD, кнопка обновления и механизм обновления сети, возможно, диалоговое окно с ошибкой, которое может быть настроено с текстом по каждому подклассу и т.д.
В принципе, я хочу добавить эту функциональность в подклассы UIViewController
подклассов И UITableViewController
, но я не могу вставить себя в иерархию классов UITableViewController
, поэтому мне действительно нужен BaseUIViewController
и BaseUITableViewController
, но если я это сделаю, я должен дважды выполнить изменения и синхронизировать их.
Какой лучший подход для размещения единого кода, который должен быть доступен как для подклассов BaseViewController
, так и для подклассов BaseTableViewController
? Мне нужно только одно место в моем коде, где мне придется иметь дело с общими задачами.
1) Я подумал об использовании категории с ассоциативными ссылками, но проблема здесь в том, что мне нужно иметь пользовательскую реализацию классов жизненного цикла ViewController, таких как viewDidLoad:, и это не очень хорошая идея.
2) Я мог полностью пропустить UITableViewController
и создать свой собственный BaseTableViewController
из BaseViewController, внедряя методы tableView
delegate
и datasource
, но я не очень хочу пропускать контроллер apple здесь.
3) Я мог бы наследовать BaseViewController
от UIViewController
, BaseTableViewController
, наследующий от UITableViewController
, и просто поместить вызовы специальных методов в третий файл ViewControllerBaseMethods
, который может быть вызван из обоих файлов Base, Возможно, все еще будет дублирование свойств, но по крайней мере код метода будет находиться в одном месте.
Любые другие хорошие подходы к этому типу?
Ответы
Ответ 1
Все UITableViewController предоставляет свойство UITableView, объявляет себя как делегат и источник данных и задает его представление как представление таблицы
создайте BaseTableViewController, который расширяет BaseViewController, объявляет его как UITableViewDataSource и UITableViewDelegate и реализует необходимые методы, добавляет свойство UITableView и реализует loadView:
- (void)loadView
{
self.tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] andStyle:UITableViewStylePlain];
self.tableView.delegate = self;
self.tableView.datasource = self;
self.view = self.tableView;
}
если вы хотите использовать разные стили табличного представления, вы можете предоставить общий метод или свойство, чтобы использовать стиль представления таблицы при инициализации
Ответ 2
Я думаю, вы должны создать определение протокола с вашими общими свойствами и функциями, и ваш BaseTableViewController и BaseViewController должны принять его. После этого ваши третьи варианты звучат хорошо, вы должны создать файл (ViewControllerBaseMethods) с реализацией протокола, который должен быть вызван из обоих файлов Base.
Таким образом, код метода будет находиться в одном месте и не будет объявлено несколько свойств.
Это способ устранить отсутствие множественного наследования в Objective-C.
Ответ 3
В Swift вы можете создать расширение UIViewController и поместить туда свои методы, таким образом вы можете использовать их из UIViewControllers и UITableViewControllers.
extension UIViewController {
var aComputedProperty: Bool {
return true
}
func aMethod() {
//do something
}
}
Недостатком этого является то, что вы не сможете использовать сохраненные свойства.
var aProperty: Int? //this is not allowed in extensions