gpt4 book ai didi

objective-c - 为什么 NSWindow 或 NSView 实例处理它自己的键事件,而不是它的委托(delegate)?

转载 作者:搜寻专家 更新时间:2023-10-30 20:08:13 25 4
gpt4 key购买 nike

作为 Cocoa 的新手,我很难理解为什么通用 NSResponder 子类会以它们看起来的方式实现关键事件。

在我的程序中,我有一个占据整个屏幕的 NSWindow 子类,并且必须处理按键事件。有几个主要的命令可以改变程序的整个状态(例如,当用户按下空格键时暂停计时器),而拥有像 NSTextField 句柄这样的 subview 是没有意义的。

在我看来,委托(delegate)( Controller )应该得到这些事件。相反,我发现我必须编写一堆困惑的粘合代码才能让窗口(通过其 keyDown:interpretKeyEvents: 选择器)通知 Controller ,或者我有只需将一堆 Controller 代码移动到 NSWindow 子类本身。

这很乱,我的直觉告诉我我遗漏了什么。有更清洁的解决方案吗?

最佳答案

如果设置正确,NSWindow 的委托(delegate)将接收消息。 Cocoa 使用响应者链转发来自第一响应者的消息——关键消息的关键 View ,以及被点击/悬停/等的 View 。对于鼠标消息——通过 super View 返回,通过窗口向上,最终到达窗口的委托(delegate)。 Apple's site 上有一个非常好的典型响应链图。 .

你真的不应该继承 NSWindow 除非你正在实现一些花哨的窗口绘图或其他类似的东西。 Cocoa 提供了 NSWindowController 类作为窗口及其内容的 Controller 。

通常的模式是继承 NSWindowController 并将您的 IBOutlet 添加到其中,然后使用 NIB 来布置您的窗口内容。您使 NSWindowController 子类成为 Interface Builder 中文件所有者代理的类。并且您还将窗口的 delegate 分配给窗口 Controller ,以便它可以成为响应者链的一部分。最后,要创建窗口,您可以使用 NSWindowControllerinitWithWindowNibName: 方法,它会自动加载带有新窗口 Controller 的 NIB 作为文件所有者。

我建议您阅读 Cocoa 文档中的窗口 Controller ,因为它们提供了您正在寻找的缺失链接。

关于objective-c - 为什么 NSWindow 或 NSView 实例处理它自己的键事件,而不是它的委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1022457/

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