Подтвердить что ты не робот

Базовый класс контроллера 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, Возможно, все еще будет дублирование свойств, но по крайней мере код метода будет находиться в одном месте.

Любые другие хорошие подходы к этому типу?

4b9b3361

Ответ 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