我有两个viewControllers
访问NSNumber
上的AppDelegate
。其中一个人可以看到它,而另一个则不能。我完全对此感到困惑。
有问题的人有这段代码。
AppDelegate *dataStore = (AppDelegate *)[[UIApplication sharedApplication] delegate];
dataStore.downHUD = [NSNumber numberWithFloat:(float)progress];
另一个有这个。
AppDelegate *dataStore = (AppDelegate *)[[UIApplication sharedApplication] delegate];
dataStore.downHUD = [NSNumber numberWithFloat:(float)0];
两者都在.m文件中导入AppDelegate,但最终以
结尾在'AppDelegate *'
类型的对象上找不到属性'downHUD'
与第一个。 谁能帮我看看有什么不对?
我错误地将大量代码复制并粘贴到AppDelegate
,这已经得到纠正。是否有某种链接可能被破坏?
答案 0 :(得分:7)
也许你的AppDelegate
课程中没有这样的属性。
在接口声明下的AppDelegate.h中,您需要
@property (nonatomic, retain) NSNumber* downHUD;
在您的AppDelegate.m实施声明中,您需要
@synthesize downHUD;
通过这种方式,您可以定义访问器(getter和setter)来访问名为downHUD
的实例变量。这个访问者是公开的,你可以做到
dataStore.downHUD = ...
也许这可能是错误。但是如果没有AppDelegate
代码,很难理解发生了什么。
希望它有所帮助。
修改强>
在应用程序委托中访问数据并不是一个好策略。我建议你使用像singletons-appdelegates-and-top-level.html
这样的单身人士编辑2:
@interface SingletonModel : NSObject {
NSNumber* downHUD_;
}
+ (id)sharedInstance;
@property (nonatomic, retain) NSNumber* downHUD;
@end
#import "SingletonModel.h"
@implementation SingletonModel
@synthesize downHUD = downHUD_;
static SingletonModel *sharedInstance = nil;
+ (SingletonModel *)sharedInstance {
if (sharedInstance == nil) {
sharedInstance = [[super allocWithZone:NULL] init];
}
return sharedInstance;
}
- (id)init
{
self = [super init];
if (self) {
}
return self;
}
-(void)dealloc
{
[super dealloc];
}
+ (id)allocWithZone:(NSZone*)zone {
return [[self sharedInstance] retain];
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)retain {
return self;
}
- (NSUInteger)retainCount {
return NSUIntegerMax;
}
- (oneway void)release {
}
- (id)autorelease {
return self;
}
@end
设置模型:
SingletonModel* model = [SingletonModel sharedInstance];
model.downHUD = ...
阅读你的模特:
SingletonModel* model = [SingletonModel sharedInstance];
NSNumber* n = model.downHUD;
有关其他信息,请阅读iphone-code-snippet-the-singleton-pattern和singleton-classes。关于单身人士,您可以在Cocoa Fundamentals Guide和Singleton处找到苹果文档。
答案 1 :(得分:1)
您的两个视图控制器可能引用不同的AppDelegate代码。即使Xcode Project Navigator只显示一组AppDelegate文件,并且Jump to Definition在两种情况下都显示相同的AppDelegate类定义,但其中一个视图控制器实际上可能有不同的委托代码。
我在委托类定义中遇到了这个问题,其中一些成员变量只在一个视图控制器中可用,而在另一个中没有。
右键单击Project Navigator中的每个ViewController.m文件,然后使用Show in Finder查看它们是否与所需的AppDelegate文件位于同一位置。如果没有,请将VC文件移动到正确的位置并将其添加到项目中。
答案 2 :(得分:0)
如果您已导入头文件,那么它应该可以工作。您是否尝试清理并重新构建项目?您可以使用CMD
+ Shift
+ K
(或从项目菜单中选择清洁)来执行此操作。