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