2011-04-01 43 views
0

我加載筆尖包含使用偏好窗口:可可,Objective C的NIB加載兩次

PreferenceWindowViewController *pref = [[PreferenceWindowViewController alloc] init]; 
[NSBundle loadNibNamed:@"PreferenceWindow" owner:pref]; 

但問題是,用戶可以輕鬆點擊菜單中的「Preferences選項」 bar(文件 - >首選項),而不關閉當前打開的首選項窗口,我想一個布爾變量設置爲真,一旦打開了筆尖,但不確定如何重新設置布爾變量爲假(筆尖未加載)當關閉優先視圖控制器類中的窗口時,它存在於主類中

回答

1

爲什麼不在應用程序明星中加載一次窗口然後做:

[pref showWindow:nil]; 

每次用戶點擊您的菜單項。那不是那麼容易嗎?

0

只是禁用文件 - >首選項選項,但不隱藏,直到關閉舊的,然後啓用該選項。

1

這通常是我如何做偏好。您的首選項控制器類是自定義的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作爲實例變量並確保它僅創建一次來完成上述目標。 prefsControllerMDPrefsController的一個實例,它是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

+0

示例項目本不回答這個問題,我需要確保他們只能享有優先權窗口打開的1份一次 – Daniel 2011-04-05 06:38:10

+0

@Daniel:對不起,我不明白這怎麼回答不了這個問題:我發佈的代碼如何能夠創建多個正在創建的首選項窗口副本?注意:我已經用更多信息更新了答案。 – NSGod 2011-04-06 01:00:43