iPhone,如何使用 App Delegate 变量使其可以像全局变量一样使用?

Posted

技术标签:

【中文标题】iPhone,如何使用 App Delegate 变量使其可以像全局变量一样使用?【英文标题】:iPhone, how do usa an App Delegate variable so it can be used like global variables? 【发布时间】:2010-09-30 17:42:11 【问题描述】:

这是我正在使用的代码,稍后查看我的错误

@interface MyAppDelegate : NSObject  
  NSString *userName;

@property (nonatomic, retain) NSString *userName;
...
@end

在 App Delegate 的 .M 文件中,您可以编写:

@implementation MyAppDelegate
@synthesize userName;
...
@end

然后,每当你想获取或写入用户名时,你会写:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
someClass.someString = appDelegate.userName;  //..to fetch
appDelegate.userName = ..some NSString..;     //..to write

警告:类型“id”不符合“MyAppDelegate”协议

我的代码中缺少什么?

【问题讨论】:

【参考方案1】:

您应该向 MyAppDelegate 添加演员表

MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];

【讨论】:

这是答案——当您从 UIApplication 中提取引用时,将其转换为您的 App Delegate 类型。也就是说,如果您有许多此类数据字段,则应考虑将它们存放在数据管理器单例中。将所有数据保留为应用程序委托的属性并不是一个好方法。 Dan,我同意,对于此类托管,AppDelegate 并不是最佳实践。 我在使用 NSNumber 和 NSString 时出现错误,请参阅下面的代码。 你应该做 intValue 而不是 integerValue 这可能应该作为一个单独的问题提出,因为我无法在评论中输入格式正确的答案。基本上,数组只存储对象,而不是原始类型,所以当它需要一个整数时,你将一个对象传递给 numberWithInt:。【参考方案2】:

是的,您可以通过将其设为全局来访问任何变量值。

例如:

AppDelegate.h


    NSString *username;


@property (strong,nonatomic) NSString *username;

AppDelegate.m(在@implementation 块中)

@synthesize username;

AnyViewController.h

#import AppDelegate.h

AnyViewController.m

//Whatever place you want to access this field value you can use it like.

AppDelegate *appdel=(AppDelegate *)[[UIApplication sharedApplication] delegate];

NSString *unm=appdel.username;

//You can get the username value here.
NSLog(@"%@",unm);

【讨论】:

以上是关于iPhone,如何使用 App Delegate 变量使其可以像全局变量一样使用?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 如何告诉 App Delegate 从当前视图呈现新视图

在 App Delegate 级别基于设备强制定向和禁用旋转?

iOS单元测试如何阻止App Delegate做事

如何从 UI 测试访问 App Delegate?

如何从app delegate访问NSViewController?

使用 TabBar 和 NavBar 在 App Delegate 中配置窗口