我正在使用以下命令加载包含首选项窗口的Nib:
PreferenceWindowViewController *pref = [[PreferenceWindowViewController alloc] init];
[NSBundle loadNibNamed:@"PreferenceWindow" owner:pref];
但问题是用户可以轻松地再次单击菜单栏中的“首选项选项”(文件 - >>首选项)而不关闭当前打开的首选项窗口,我想到要设置为的布尔变量一旦打开nib就会返回true,但不确定如何在首选视图控制器类中关闭窗口时将布尔变量设置为false(Nib not loaded),该类存在于主类中
答案 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…
成为实例变量并确保它只创建一次来实现上述目标。 prefsController
是prefsController
的一个实例,它是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;首选项选项,但不隐藏,直到关闭旧选项,然后启用该选项。