Подтвердить что ты не робот

Короткая рука для делегата [[UIApplication sharedApplication]]?

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

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

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

4b9b3361

Ответ 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