iPhone - ссылка на делегат приложения в общем классе - PullRequest
0 голосов
/ 30 июля 2011

Я пишу универсальный класс, который может быть использован в разных проектах по ссылке.
В какой-то момент я вызываю метод для слушателя, который был получен от того, кто владеет объектом и хранится в классе с помощью assign.
Но иногда этот вызывающий может исчезнуть, поэтому я хочу в этом случае направить ответное сообщение делегату приложения.

Вот как я делаю для вызывающей стороны (вызывающей является та, которая создала и владеет экземпляром моего класса):

if ([self.responseListener respondsToSelector:@selector(serverAnswered:error:)]) {
        // some job to construct the return object

        [self.responseListener performSelector:@selector(serverAnswered:error:) withObject:response withObject:nil];
    }

Как я могу ссылаться на класс делегата приложения вместо responseListener, когда вызывающий объект исчез?

1 Ответ

3 голосов
/ 30 июля 2011

Я не уверен, что вы подразумеваете под "вызывающим абонентом" в "когда вызывающий абонент исчез". Вот как вы можете получить доступ к делегату приложения из любого места.

[UIApplication sharedApplication].delegate;

Если вам нужно вызывать методы, уникальные для вашего конкретного приложения, вам нужно импортировать его и привести.

#import "MyAppDelegate.h"

// ...

MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;

Обновление:

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

// The app delegate in your library users app
#import "YourFancyLibrary.h"

@interface MyAppDelegate : NSObject <UIApplicationDelegate, YourFancyLibraryDelegate>

// In YourFancyLibrary.h, declare that protocol
@protocol YourFancyLibraryDelegate
- (void)myFancyMethod;
@end

// Refer to it in the guts of your library.
id<YourFancyLibraryDelegate> delegate = [UIApplication sharedApplication].delegate;
if (![delegate conformsToProtocol:@protocol(YourFancyLibraryDelegate)]) return;
if (![delegate respondsToSelector:@selector(myFancyMethod)]) return;
[delegate myFancyMethod];

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

Вы также можете пропустить протокол и напрямую вызывать методы для него.

id appDelegate = [UIApplication sharedApplication].delegate;
SEL methodToCall = @selector(someMethod);
if ([appDelegate respondsToSelector:methodToCall]) {
    [appDelegate performSelector:methodToCall];
}
...