Короткая рука для делегата [[UIApplication sharedApplication]]?
Я сохранил глобальные переменные в своем AppDelegate и получаю к ним доступ:
AppDelegate *d = [[UIApplication sharedApplication] delegate];
d.someString = ...
Что рекомендуют, чтобы сохранить некоторую типизацию, и поэтому мне не нужно AppDelegate *d = [[UIApplication sharedApplication] delegate];
снова и снова? Спасибо!
Ответы
Ответ 1
Как сказал Shaggy Frog, определите макрос в файле YourAppDelegate.h, например:
#define AppDelegate (YourAppDelegate *)[[UIApplication sharedApplication] delegate]
Затем вы можете получить делегат приложения в своем коде следующим образом:
[AppDelegate ......];
Ответ 2
Так как ваш делегат приложения никогда не изменяется, вы можете создать внешний, который вы определяете в коде делегата приложения, очень похожем на внешние приложения NSApp
для Mac OS X Cocoa.
Итак, определите внешний элемент в заголовке AppDelegate (или что-то еще, что вы включили всюду):
extern AppDelegate* appDelegate;
Затем создайте его и установите в файл реализации:
AppDelegate* appDelegate = nil;
// later -- i can't recall the actual method name, but you get the idea
- (BOOL)applicationDidFinishLaunchingWithOptions:(NSDictionary*)options
{
appDelegate = self;
// do other stuff
return YES;
}
Тогда другие классы могут просто получить к нему доступ:
#import "AppDelegate.h"
// later
- (void)doSomethingGreat
{
NSDictionary* mySettings = [appDelegate settings];
if( [[mySettings objectForKey:@"stupidOptionSet"] boolValue] ) {
// do something stupid
}
}
Ответ 3
Вы можете просто создать макрос C-стиля и поместить его в файл заголовка где-нибудь.
(Что касается использования делегата приложения в качестве гигантской глобальной переменной catch-all, это еще одно напыщенное письмо за другой день.)
Ответ 4
Я создаю категорию под названием UIApplication + delegate с некоторыми удобными сообщениями в нем. Получение моего конкретного делегата одним из удобных сообщений. Так, например, если мой делегат приложения был вызван MyAppDelegate, он выглядел бы так:
UIApplication + delegate.h
#import "MyAppDelegate.h"
@interface UIApplication(delegate)
+ (MyAppDelegate *)thisApp;
@end
и UIApplication + delegate.m
#import "UIApplication+delegate.h"
@implementation UIApplication(delegate)
+ (MyAppDelegate *)thisApp {
return (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
}
@end
В классе, которому нужен делегат, я делаю следующее:
#import "UIApplication+delegate.h"
...
- (void)doStuff {
MyAppDelegate *app = [UIApplication thisApp];
// use "app"
}
Ответ 5
Я также создал категорию, за исключением того, что я применил мой к NSObject, чтобы любой объект в приложении мог легко добраться до делегата.
#import "MyAppDelegate.h"
@interface NSObject(delegate)
- (MyAppDelegate *) appDelegate;
@end
#import "NSObject+delegate.h"
@implementation UIApplication(delegate)
- (MyAppDelegate *)appDelegate {
return (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
}
@end