views:

32

answers:

1

I have a singleton in my FTP app designed to store all of the types of servers that the app can handle, such as FTP or Amazon S3. These types are plugins which are located in the app bundle. Their path is located by applicationWillFinishLoading: and sent to the addServerType: method inside the singleton to be loaded and stored in an NSMutableDictionary.

My question is this:
How do I bind an NSDictionaryController to the dictionary inside the singleton instance? Can it be done in IB, or do I have to do it in code? I need to be able to display the dictionary's keys in an NSPopupButton so the user can select a server type.

Thanks in advance!
SphereCat1

A: 

I found / made up the answer to this: I simply override the init method so when it's called from the XIB file, it still returns the singleton. I then provide a method named realInit to do an actual initialization the first time init is called.

Code:

-(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;
}

EDIT: Of course you'll need to define _sharedInstance as a static variable at the top of your class implementation:

static ClassTypeGoesHere *_sharedInstance;

ALSO EDIT: Since you now know for sure that your init method will be called at least once, you can go ahead and replace your normal singleton sharedInstance method with this:

+(ClassTypeGoesHere *)sharedInstance
{
    return _sharedInstance;
}

If anyone sees any obvious problems with this design, please let me know! SphereCat1

SphereCat1