Feeds

A better way to build OS X preferences

Behind the interface

Beginner's guide to SSL certificates

To use these classes, you’ll first need to get the corresponding header files NSPreferences.h and NSPreferencesModule.h. The simplest way of doing this is to use Steve Nygard’s excellent class-dump utility, which you can find here. Run it on the actual executable inside Appkit.framework and redirect the output to a temporary text file. You can then edit this file to extract the class declarations you’re interested in.

Create a new, empty Cocoa application to serve as a test bed for this stuff. You’ll typically want to invoke the preferences window in response to a menu option, but in my test application, I just used a button press in the main window. Here’s what the action procedure (inside AppController.m) looks like:

- (IBAction) showPreferences: (id) sender
{
    [NSPreferences setDefaultPreferencesClass: [AppPreferences class]];
    [[NSPreferences sharedPreferences] showPreferencesPanel];
}

Here, we’ve set up a subclass of NSPreferences called AppPreferences. This code tells NSPreferences to use that class, and then displays the preferences dialog. It’s inside AppPreferences.m that the interesting stuff happens:

- (id) init
{
    _nsBeginNSPSupport();    // MUST come before [super init]
    [super init];
    [self addPreferenceNamed: @"General" 
             owner: [GeneralPreferences sharedInstance]];
    [self addPreferenceNamed: @"HotKeys" 
             owner: [HotKeyPreferences sharedInstance]];
    return self;
}

- (BOOL) usesButtons
{
    return NO;
}

In this case, the init method (called from AppKit) adds two pages to our preference dialogs: GeneralPreferences and HotKeyPreferences. Both of these are sub classed from NSPreferencesModule.

Two points: first, in real-world code you’d typically localize the page names, “General” and “HotKeys” in this case. Second, by default, NSPreferences will assume the needed NIB files and image files have the same name as the module class, such as GeneralPreferences.nib or GeneralPreferences.png for example. Image files should be 32×32 pixels in size.

You’ll also note that evil-looking call to _nsBeginNSPSupport. This is a fairly recent addition by Apple that is designed, I suspect, to prevent third-party use of NSPreferences. Without a preceding call to this extern void routine, the call to super init will return nil.

A very simple demo project can be downloaded here.

There’s more that can be said about NSPreferences and NSPreferencesModule, of course, but I’ll mention just one other interesting feature of NSPreferences for now. When you call the init method for this class, it will look in your application’s resource path for a file called PreferencePanels.plist. If found, this file is used to add all your application’s preference panels in one go. For more on this, have a peek at the aforementioned PreferencePanels.plist file inside your Mail.app.

Until next time, have fun! ®

Top 5 reasons to deploy VMware with Tegile

More from The Register

next story
Microsoft to bake Skype into IE, without plugins
Redmond thinks the Object Real-Time Communications API for WebRTC is ready to roll
Mozilla: Spidermonkey ATE Apple's JavaScriptCore, THRASHED Google V8
Moz man claims the win on rivals' own benchmarks
Microsoft promises Windows 10 will mean two-factor auth for all
Sneak peek at security features Redmond's baking into new OS
FTDI yanks chip-bricking driver from Windows Update, vows to fight on
Next driver to battle fake chips with 'non-invasive' methods
DEATH by PowerPoint: Microsoft warns of 0-day attack hidden in slides
Might put out patch in update, might chuck it out sooner
Ubuntu 14.10 tries pulling a Steve Ballmer on cloudy offerings
Oi, Windows, centOS and openSUSE – behave, we're all friends here
Apple's OS X Yosemite slurps UNSAVED docs into iCloud
Docs, email contacts... shhhlooop, up it goes
Was ist das? Eine neue Suse Linux Enterprise? Ausgezeichnet!
Version 12 first major-number Suse release since 2009
prev story

Whitepapers

Cloud and hybrid-cloud data protection for VMware
Learn how quick and easy it is to configure backups and perform restores for VMware environments.
Forging a new future with identity relationship management
Learn about ForgeRock's next generation IRM platform and how it is designed to empower CEOS's and enterprises to engage with consumers.
Reg Reader Research: SaaS based Email and Office Productivity Tools
Read this Reg reader report which provides advice and guidance for SMBs towards the use of SaaS based email and Office productivity tools.
Saudi Petroleum chooses Tegile storage solution
A storage solution that addresses company growth and performance for business-critical applications of caseware archive and search along with other key operational systems.
How to simplify SSL certificate management
Simple steps to take control of SSL certificates across the enterprise, and recommendations centralizing certificate management throughout their lifecycle.