gpt4 book ai didi

objective-c - NSWindowController 将所有输入发送到主窗口进行处理?

转载 作者:行者123 更新时间:2023-12-03 17:51:24 26 4
gpt4 key购买 nike

我正在通过自定义方法创建并显示一个 NSWindow,它恰好是我的首选项菜单:

- (void)openPreferencesWindow{
if (![self.windowController isWindowLoaded]){
self.windowController = [[CCPreferencesController alloc] initWithWindowNibName:@"PreferenceMenu"];
}
[[self.windowController window] makeKeyAndOrderFront:self];
}

这工作正常,但是窗口中有文本字段,这些文本字段将所有按键发送到主窗口,然后主窗口根据我在 IB 中的操作来处理它们。澄清一下:

  1. 我调用openPreferencesWindow:
  2. 我在首选项菜单打开时按向左箭头键
  3. 我的主窗口注册了这个箭头按下,并调用 leftArrow: 方法,从而更新主窗口,不再是关键窗口

我认为将新窗口设置为firstResponder 或keyWindow 可以工作,并且不会将所有输入发送到主窗口:

[self.windowController window] makeFirstResponder:self.windowController];

除了在首选项窗口为关键时键入的任何内容仍由主窗口处理。如何使首选项菜单自行处理所有输入,而不让主窗口响应它们?

<小时/>

AppDelegate.m

@property (strong) CCPreferencesController *windowController;

...

- (void)promptUserToLogin{
...
[self openPreferencesWindow];
}

- (void)openPreferencesWindow{
if (![self.windowController isWindowLoaded]){
self.windowController = [[CCPreferencesController alloc] initWithWindowNibName:@"PreferenceMenu"];
}
[[self.windowController window] makeKeyAndOrderFront:self];
}

CCPreferencesController.h

@interface CCPreferencesController : NSWindowController {}
...

CCPreferencesController.m

- (id)init{
if(self = [super initWithWindowNibName:@"PreferenceMenu"]) {}
return self;
}

PreferenceMenu.xib

  1. 文件的所有者类是“CCPreferencesController”
  2. 窗口的引用导出是文件的所有者

MainMenu.xib

  1. 菜单项的发送操作是调用“openPreferencesWindow”的 IBAction

最佳答案

我查看了您发布的示例项目并得出以下结论:

此行为是预期的(我认为)您已将箭头键设置为菜单快捷方式,因此它们会触发该菜单操作(NextImage 和 PreviousImage)。

我已经验证,如果禁用这些菜单项,则箭头键在首选项窗口中可以正常工作。

当主窗口未获得焦点时,您应该能够使用 cocoa 绑定(bind)来禁用这些菜单项。尝试使用 isKeyWindowkeyWindow 绑定(bind)到窗口(据我所知,这是一个未记录的绑定(bind),因此可能不再有效)。

您可以通过 IB 绑定(bind)到 nib 中任何对象(AppController、Windows 等)的 KVO 兼容属性(甚至是其属性的 KVO 路径)。

如果您希望绑定(bind)的对象不在您的 Nib 中或直到生命周期后期才存在,您还可以在运行时分配绑定(bind)(使用bind:toObject:withKeyPath:options :;请务必解除绑定(bind))。

所需要的只是该属性符合 KVO 标准,即 @synthesized 属性,并且任何其他动态属性都可以,如果您使用 willChangeValuForKey: didChangeValueForKey:。参见苹果Cocoa Bindings documentation (其中包含 KVC/KVO 文档的链接)。

您可能更喜欢启用/禁用菜单项的几种替代方法:

  1. 指定与箭头键一起使用的修饰符,例如 Command
  2. 处理这些菜单项绑定(bind)到的任何控件/窗口内的   ←  键(通过覆盖 keyDown: 和/或 keyUp:)并删除这些菜单项的键盘快捷键。

编辑2:here is a post关于如何基于 keyWindow 启用/禁用菜单项,包括使用 cocoa 绑定(bind)。

关于objective-c - NSWindowController 将所有输入发送到主窗口进行处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25814292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com