[[UIApplication sharedApplication]委托]的简写?

时间:2010-11-10 03:44:44

标签: iphone objective-c delegates singleton

我将全局变量存储在AppDelegate中并通过以下方式访问它们:

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

保存一些打字的推荐方法是什么,所以我不需要一次又一次AppDelegate *d = [[UIApplication sharedApplication] delegate];?谢谢!

5 个答案:

答案 0 :(得分:41)

正如 Shaggy Frog 所说,在YourAppDelegate.h文件中定义一个宏,如下所示:

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

然后你可以在代码中获得app委托代码:

[AppDelegate ......];

答案 1 :(得分:11)

由于您的app委托永远不会真正更改,您可以创建一个在app委托代码中定义的外部代码,非常类似于Mac OS X Cocoa应用程序的NSApp外部代码。

因此,在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
  }
}

答案 2 :(得分:8)

您可以创建一个C风格的宏并将其放在某个头文件中。

(至于将你的app delegate用作一个巨大的全局变量catch-all,这是另一天的另一个咆哮。)

答案 3 :(得分:4)

我创建了一个名为 UIApplication + delegate category,其中包含一些便利消息。让我的特定代表成为便利消息之一。因此,举例来说,如果我的应用代理被称为 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"
}

答案 4 :(得分:2)

我还创建了一个类别,除了我将我的应用程序应用到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