Сокращения для [[UIApplication sharedApplication] делегата]? - PullRequest
29 голосов
/ 10 ноября 2010

Я сохранил глобальные переменные в своем AppDelegate и получил к ним доступ:

AppDelegate *d = [[UIApplication sharedApplication] delegate];
d.someString = ...

Каков рекомендуемый способ сохранить набор текста, поэтому мне не нужно AppDelegate *d = [[UIApplication sharedApplication] delegate]; снова и снова? Спасибо!

Ответы [ 5 ]

41 голосов
/ 10 ноября 2010

Как сказал Shaggy Frog , определите макрос в вашем файле YourAppDelegate.h, например, так:

#define AppDelegate (YourAppDelegate *)[[UIApplication sharedApplication] delegate]

Тогда вы можете получить делегат приложения в своем коде, например так:

[AppDelegate ......];
11 голосов
/ 10 ноября 2010

Поскольку ваш делегат приложения никогда не изменяется, вы можете создать внешнее устройство, которое вы определяете в коде делегата приложения, очень похожее на внешнее 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
  }
}
8 голосов
/ 10 ноября 2010

Вы можете просто создать макрос в стиле C и поместить его в файл заголовка где-нибудь.

(Что касается использования вашего приложения-делегата в качестве гигантской глобальной переменной-ловушки, это еще одна напыщенная речь на следующий день.)

4 голосов
/ 10 ноября 2010

Я создаю категорию с именем UIApplication + делегат с некоторыми удобными сообщениями. Получение моего конкретного делегата является одним из вспомогательных сообщений. Так, например, если бы мой делегат приложения назывался 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"
}
2 голосов
/ 10 ноября 2010

Я также создал категорию, за исключением того, что применил мою к 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

...