从其他类设置NSStatusBar标题?

时间:2011-02-06 13:42:08

标签: objective-c cocoa macos

我试图改变我的NSStatusBar中的标题来自不同的类,我的偏好类。

在我的ManagerClass.m&我已宣布

- (NSStatusItem *)statusItem { return statusItem; }

然后我在我的preferences.m

中导入了我的ManagerClass.h

然后在preferences.m里面我尝试执行:

ManagerClass *someInstanceToIt = [[ManagerClass alloc] init]; 
[(NSStatusItem *)[someInstanceToIt statusItem] setTitle:@"New Title"];

但似乎statusItem永远不会传递给preferences.m文件,如果我使用if进行测试,我可以看到statusItem为空。

有什么想法吗?我完全被卡住了

2 个答案:

答案 0 :(得分:1)

使用[[ManagerClass alloc] init]时,您正在创建新实例。您可能想要一个先前创建的对象,而不是新对象。

有解决问题的方法: - 第一个解决方案是传递创建的ManagerClass实例并将其传递给首选项控制器。但是在这种情况下,你必须不断地将ManagerClass实例保存在一个变量中,这样你就不会丢失它。 - 另一种方法是实现单例设计。这意味着您可以选择在整个应用程序中拥有一个共享对象。一个例子可以在下面找到:

@implementation aClass
- (id)init {
    self = [super init];
    if(self != nil) {
    }
    return self;
}

+ (id)sharedInstance { // note the + for a class method
    static id shared = nil;
    if(shared == nil) {
        shared = [[self alloc] init];
    }
    return shared;
}
@end

现在,您可以调用此代码以在每次调用时接收相同的对象:

aClass *sharedObject = [aClass sharedInstance];

希望它有所帮助, ief2

答案 1 :(得分:0)

首先,someInstanceToIt应该是一个实例变量,因此只要您需要状态项,就可以拥有此实例。

其次,确保实现-[ManagerClass init]以创建NSStatusItem并将其存储在ManagerClass实例的statusItem实例变量中。 <{1}}包含statusItem,直到发生这种情况。

第三,“ManagerClass”对于一个类来说不是一个很好的名字。注意我不得不说上面的“ManagerClass实例”。我建议使用“StatusItemManager”;有了这个改变,我可以说“StatusItemManager的实例变量”。