Вызов метода Objective-C категории пользовательского класса

У меня есть некоторые классы, давайте назовем их A, B и C, которые наследуются от UIViewController и некоторой категории UIViewController, в которой есть некоторые методы, которые должны быть общими для всех классов.
Методы категории должны вызывать другие методы на ViewControllers, но. Не все методы будут реализованы в VC (потому что они никогда не будут вызываться в этом контексте).
Если я пишу определение метода в категории, я получаю ошибку, что метод не объявлен, но он объявлен в VC или не объявлен и никогда не будет использоваться в этом контексте.
Есть ли идеи, как это переопределить и разделить огромную часть кода (кода навигации) между несколькими ViewControllers?

- (void)homeButtonPressed {
    NSLog(@"Home button pressed, ViewController");
}

- (void)changeFloorButtonPressed {
    [self changeFloor];
    NSLog(@"Change Floor button pressed, ViewController");
}
- (void)QRButtonPressed {
    NSLog(@"QR button pressed, ViewController");
}  

Вот [self changeFloor]; это метод, который специфичен только для одного ViewController.

2 ответа

Решение

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

MyBaseViewController: UIViewController

ViewAViewController: MyBaseViewController

ViewBViewController: MyBaseViewController

так далее

Я использую этот тип подхода для универсальных приложений, мой дочерний класс может переопределить реализацию от родителя или добавить к ней.

// общие элементы HomeViewController: UIViewController

// Специфичная реализация для iPhone HomeViewController_iPhone: HomeViewController

// Специфичная для iPhone реализация HomeViewController_iPad: HomeViewController

Создайте протокол target-c, который объявляет @optional метод для -(void)changeFloor; Затем, в вашей категории, соответствуют этому протоколу. Вы сможете вызывать метод changeFloor без получения ошибки компиляции.

Поскольку метод является необязательным, вы должны проверить:

[self respondsToSelector:@selector(changeFloor)] перед вызовом changeFloor.

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

Другие вопросы по тегам