从另一个类调用的Singleton IBOutlet返回nil

时间:2014-09-24 10:28:28

标签: objective-c macos singleton iboutlet

我尝试调用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;
    }

谢谢, 托马斯

2 个答案:

答案 0 :(得分:1)

我强烈建议您重新考虑应用程序的架构!无论如何,也许你找到了你的答案"在nibs中通过allocWithZone分配实例:不分配,尝试覆盖它来调用你的sharedOptions类方法。

答案 1 :(得分:0)

您的myButton对象可能已取消分配,因为只有您的单身人士指向NSButton。您应该尝试将引用类型从weak更改为strong

您的错误的另一个可能原因可能是IBOutlet和单身人士。说实话,我从未见过这样的组合,根据Apple指南,它可能不是一个好的做法。请尝试删除IBOutlet并以编程方式设置NSButton