Как добавить UIApplicationDelegate в конец цепочки UIResponder?
Я пытаюсь обеспечить IBAction
метод для общей функциональности, которая требуется в различных частях приложения.
т. е. вход в систему реализован модально, и в случае его успешного завершения появляется уведомление, которое позволяет всем загруженным контроллерам представления реагировать на это событие (переход от анонимного к аутентифицированному).
@interface MyAppDelegate : NSObject <UIApplicationDelegate>
{
...
}
- (IBAction)loginTapped:(id)sender;
@end
Я установил действие этой кнопки для первого ответчика в IB, однако цепочка респондента не дает MyAppDelegate
шанс ответить.
Моя проблема в том, что я не хочу копировать метод в разных частях цепочки респондента, я хотел бы добавить его в общий класс, который уже является подклассом.
UIResponder
цепь проходит весь путь до UIApplication
но это, кажется, конец. мой UIApplicationDelegate
не может участвовать
Я хочу вставить или добавить своего делегата в цепочку респондента!
(или найдите другой способ подключить UIButton
доработка внутри реализации приложения. Я хочу избежать подклассов UITabBarController
или же UIWindow
если возможно)
2 ответа
Вы могли бы подкласс UIApplication
иметь -nextResponder
вернуть делегат приложения, если это UIResponder
подкласс. Затем вам нужно будет изменить свой вызов UIApplicationMain
использовать свой собственный подкласс.
Я не пробовал это сам, но я не могу думать ни о каких непосредственных проблемах, которые это могло бы вызвать.
Начиная с iOS 5, AppDelegate автоматически становится последней ссылкой в цепочке респондента. Шаблоны проекта XCode создадут AppDelegate, который является подклассом UIResponder
скорее, чем NSObject
, Однако, чтобы не загромождать AppDelegate, переопределите AppDelegate nextResponder
и переложить работу в кастом UIResponder
объект:
- (UIResponder *)nextResponder
{
static dispatch_once_t onceToken;
static LastUIResponder *lastResponder = nil;
dispatch_once(&onceToken, ^{
lastResponder = [[LastUIResponder alloc] init];
});
return lastResponder;
}