如何在Cocoa中将控件绑定到单例?

4
我在我的FTP应用程序中有一个单例,旨在存储应用程序可以处理的所有类型的服务器,例如FTP或Amazon S3。这些类型是位于应用程序绑定包中的插件。它们的路径是通过applicationWillFinishLoading:找到的,并发送到单例内的addServerType:方法中进行加载和存储在NSMutableDictionary中。
我的问题是:
如何将NSDictionaryController绑定到单例实例内的字典?它可以在IB中完成,还是必须在代码中完成?我需要能够在NSPopupButton中显示字典的键,以便用户可以选择服务器类型。
提前致谢!
SphereCat1

2
有人吗?大家好,有人在吗? - vilhalmer
1个回答

2
我找到/想出了答案:我只需覆盖init方法,这样当它从XIB文件中调用时,仍然返回单例。然后我提供一个名为realInit的方法来在第一次调用init时进行实际初始化。
代码:
-(id)init
{
    @synchronized(self)
    {
        if (_sharedInstance == nil)
        {
            _sharedInstance = [[VayprServerTypes alloc] realInit];
        }
    }
    [self release];

    return _sharedInstance;
}

-(id)realInit
{
    if (self = [super init])
    {
        serverTypesArray = [[NSMutableArray alloc] init];
    }

    return self;
}

编辑:当然,您需要在类实现的顶部将_sharedInstance定义为静态变量:

static ClassTypeGoesHere *_sharedInstance;

另外编辑:既然您现在确定您的init方法至少会被调用一次,那么您可以使用以下代码替换您正常的单例sharedInstance方法:

+(ClassTypeGoesHere *)sharedInstance
{
    return _sharedInstance;
}

如果有任何人在这个设计方案上看到了明显的问题,请告诉我!SphereCat1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接