Как добавить 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;
}
Другие вопросы по тегам