這通常是我如何做偏好。您的首選項控制器類是自定義的NSWindowController子類。在您的主應用程序控制器中,爲您的偏好控制器創建一個實例變量,如下所示。
MDAppController.h:
@class MDPrefsController;
@interface MDAppController : NSObject <NSApplicationDelegate> {
MDPrefsController *prefsController;
}
- (IBAction)showPrefsWindow:(id)sender;
@end
MDAppController.m:
#import "MDAppController.h"
#import "MDPrefsController.h"
@implementation MDAppController
- (void)dealloc {
[prefsController release];
[super dealloc];
}
- (IBAction)showPrefsWindow:(id)sender {
if (prefsController == nil)
prefsController = [[MDPrefsController alloc] init];
[prefsController showWindow:self];
}
@end
你必須設置爲來電像-showPrefsWindow:
方法的首菜單項。在該方法中,首先檢查您的prefsController
實例變量是否爲nil
,如果是,則使用alloc/init創建它。 (注意:prefsController
這樣的實例變量在MDAppController
的-init
方法中會自動初始化爲零)。保證了prefsController
存在後,你把它的標準NSWindowController
方法-showWindow:
MDPrefsController.h:
@interface MDPrefsController : NSWindowController <NSToolbarDelegate> {
}
@end
MDPrefsController.m:
#import "MDPrefsController.h"
@implementation MDPrefsController
- (id)init {
if ((self = [super initWithWindowNibName:@"MDPrefs"])) {
}
return self;
}
- (IBAction)showWindow:(id)sender {
if (![[self window] isVisible]) {
[[self window] center];
}
[[self window] makeKeyAndOrderFront:nil];
}
@end
所以通過使您prefsController
一個實例變量,你可以檢查以確保它只創建一次。此外,用戶可以隨時從應用程序菜單中隨時選擇「首選項」,並且結果是首選項的窗口被提出。
[編輯]我會添加更多的信息,關於這個設置如何確保只有一個副本的偏好窗口創建。
首先,我們應該澄清當用戶從應用程序菜單中選擇Preferences…
菜單項時,所需的行爲應該是什麼。當用戶選擇prefs菜單項時,如果單個prefs窗口當前未顯示,應該使其可見。另一方面,如果prefs窗口已經可見,那麼它應該提前。大多數情況下,該菜單項應始終處於啓用狀態。 (換句話說,即使當前正在顯示prefs窗口,菜單項仍然處於啓用狀態,當選擇時,它只會使prefs窗口前進)。
我發佈的代碼通過將prefsController
作爲實例變量並確保它僅創建一次來完成上述目標。 prefsController
是MDPrefsController
的一個實例,它是NSWindowController
的子類。 NSWindowController
管理通常存儲在nib文件中的單個窗口。在你的例子中,你使用NSBundle
來處理主控制器中的nib加載代碼。在我的例子中,我把它歸入MDPrefsController
類,它將加載其-init
方法中指定的「MDPrefs.nib」文件。 (MDPrefsController
覆蓋-init
以致電NSWindowController
的-initWithWindowNibName:
)。該nib文件包含MDPrefsController
管理的單個窗口。
下面的代碼檢查中,以能夠只確保只有MDPrefsController
的單個實例被創建過,正因爲如此,確保了MDPrefs.nib文件,其中包含單選項窗口,只裝載一次:
- (IBAction)showPrefsWindow:(id)sender {
if (prefsController == nil)
prefsController = [[MDPrefsController alloc] init];
[prefsController showWindow:self];
}
因此,您確保只有單個副本的首選項窗口。
[編輯2]:在http://www.markdouma.com/developer/PreferencesWindow.zip
示例項目本不回答這個問題,我需要確保他們只能享有優先權窗口打開的1份一次 – Daniel 2011-04-05 06:38:10
@Daniel:對不起,我不明白這怎麼回答不了這個問題:我發佈的代碼如何能夠創建多個正在創建的首選項窗口副本?注意:我已經用更多信息更新了答案。 – NSGod 2011-04-06 01:00:43