我将全局变量存储在AppDelegate中并通过以下方式访问它们:
AppDelegate *d = [[UIApplication sharedApplication] delegate];
d.someString = ...
保存一些打字的推荐方法是什么,所以我不需要一次又一次AppDelegate *d = [[UIApplication sharedApplication] delegate];
?谢谢!
答案 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