可可,目标c NIB加载两次

时间:2011-04-01 12:05:03

标签: objective-c cocoa macos

我正在使用以下命令加载包含首选项窗口的Nib:

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

但问题是用户可以轻松地再次单击菜单栏中的“首选项选项”(文件 - >>首选项)而不关闭当前打开的首选项窗口,我想到要设置为的布尔变量一旦打开nib就会返回true,但不确定如何在首选视图控制器类中关闭窗口时将布尔变量设置为false(Nib not loaded),该类存在于主类中

3 个答案:

答案 0 :(得分:1)

为什么不在应用启动时加载一次窗口,然后执行:

[pref showWindow:nil];

每次用户点击您的菜单项。那不是更容易吗?

答案 1 :(得分:1)

这通常是我喜欢的方式。您的首选项控制器类是自定义NSWindowController子类。在主应用程序控制器中,为prefs控制器创建一个实例变量,如下所示。

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的{​​{1}}方法中自动初始化为nil。确保-init存在后,您可以向其发送标准prefsController方法NSWindowController

MDPrefsController.h:

-showWindow:

MDPrefsController.m:

@interface MDPrefsController : NSWindowController <NSToolbarDelegate> {

}

@end

因此,通过使#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菜单项时应该采取的行为。当用户选择prefs菜单项时,如果当前未显示单个prefs窗口,则应使其可见。另一方面,如果prefs窗口已经可见,那么它应该被提前。在大多数情况下,应始终启用此菜单项。 (换句话说,即使当前正在显示prefs窗口,菜单项仍然处于启用状态。选择后,它只会将prefs窗口向前移动。)

我发布的代码通过使Preferences…成为实例变量并确保它只创建一次来实现上述目标。 prefsControllerprefsController的一个实例,它是MDPrefsController的子类。 NSWindowController管理通常存储在nib文件中的单个窗口。在您的示例中,您使用NSWindowController处理主控制器中的nib加载代码。在我的,我将其分解为NSBundle类,它将加载其MDPrefsController方法中指定的“MDPrefs.nib”文件。 (-init会覆盖MDPrefsController来致电-init的{​​{3}})。该nib文件包含NSWindowController管理的单个窗口。

下面显示的代码检查以确保只创建了MDPrefsController的单个实例,并因此确保仅加载包含单个首选项窗口的MDPrefs.nib文件一旦:

MDPrefsController

因此,您可以确保只有一个prefs窗口的副本。

[编辑2]:-initWithWindowNibName:

的示例项目

答案 2 :(得分:0)

只需停用文件 - &gt;首选项选项,但不隐藏,直到关闭旧选项,然后启用该选项。