我尝试调用IBOutlet,它是来自另一个类的Singleton Object的属性,但它返回nil。我在这里读过很多关于单身人士的帖子,但似乎有些东西我不知道了。这是一个OSX问题。
在Interface Builder中,我有一个Button和一个将Singleton设置为自定义类的Object。 Singletons课程被称为“CEOptionsST”。该按钮作为IBOutlet连接到Singleton的类头
@property (weak) IBOutlet NSButton *mybutton;
稍后我想从另一个班级访问按钮的状态。所以我打电话给:
CEOptionsST *opt = [CEOptionsST sharedOptions];
NSLog(@"state: %ld",(long)[[_opt mybutton] state]);
无论按钮是打开还是关闭,它总是返回0。使用Textfields而不是按钮返回nil。
当我从Singleton和self
内部记录opt
时,指针是相同的。所以Singleton没有实例两次。
当我在调试模式下检查opt
时,它告诉我所有属性都是零。 IBOutlet属性“mybutton”为零。因此,Interface Builder(或nib)启动的Singleton对象与opt
相同,但mybutton和其他属性的状态不可访问 - 我错过了什么?
我想要实现的是将UI控件作为用户的“选项”,可以在整个应用程序中访问 这是我的Singleton课程(由Dave DeLong撰写answer):
@interface CEOptionsST : NSObject
+ (id) sharedOptions;
@property (weak) IBOutlet NSButton *mybutton;
@end
@implementation CEOptionsST
+ (void)initialize{
[self sharedOptions];
}
+ (id)sharedOptions {
static CEOptionsST *sharedOptions = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedOptions = [[self actualAlloc] initActual];
});
return sharedOptions;
}
+ (id)actualAlloc {
return [super alloc];
}
+ (id)alloc {
return [CEOptionsST sharedOptions];
}
- (id)initActual {
self = [super init];
if (self) {
}
return self;
}
- (id)init {
return self;
}
- (id)initWithCoder:(NSCoder *)decoder {
return self;
}
谢谢, 托马斯
答案 0 :(得分:1)
我强烈建议您重新考虑应用程序的架构!无论如何,也许你找到了你的答案"在nibs中通过allocWithZone分配实例:不分配,尝试覆盖它来调用你的sharedOptions类方法。
答案 1 :(得分:0)
您的myButton
对象可能已取消分配,因为只有您的单身人士指向NSButton
。您应该尝试将引用类型从weak
更改为strong
。
您的错误的另一个可能原因可能是IBOutlet
和单身人士。说实话,我从未见过这样的组合,根据Apple指南,它可能不是一个好的做法。请尝试删除IBOutlet
并以编程方式设置NSButton
。