gpt4 book ai didi

cocoa - NSWindowController理解澄清

转载 作者:行者123 更新时间:2023-12-03 16:00:41 25 4
gpt4 key购买 nike

我在项目中多次使用过 NSWindowController,感觉我对这个重要类背后的概念有了(非常)粗略的掌握。我想通过这篇文章来澄清/纠正我自己的理解,并希望帮助其他学习者迈出理解的第一步。我发现最有用的是概览概念、概述和最佳实践,但文档中往往缺乏这些内容。这是我对 NSWindowController 的看法(问题以粗体显示):

  • NSWindowController (NSWC) 子类(概念上)存在于每个窗口 Nib 下方,充当用户界面元素和它们控制/表示的模型对象之间的粘合剂。基本上,应用程序中的每个窗口都应该有自己的 NSWC 子类。
  • Nib 的文件所有者应始终是 NSWC 子类。 MainMenu.xib 应用程序也是如此吗?
  • NSWC window 属性应始终链接到 InterfaceBuilder 中的 NSWindow。
  • 您应该使用[super initWithWindowNibName:]覆盖“init”方法,以便当您引用[mycontroller window]时它会加载 Nib 。 MainMenu.xib 窗口的 NSWC 是否也应该出现这种情况,即使该窗口在启动时打开?
  • NSWC 不应该做太多繁重的工作 - 它应该简单地将消息传递给对象实例,并在 UI 中呈现这些对象。
  • 它可以使用绑定(bind)来修改 UI,或者充当表等的委托(delegate),或者在观察到变化时主动更改 UI 元素,或者以上任何一种的组合(您使用的似乎是这是一个品味问题,各方面都有优点和缺点)。
  • NSWC 可以在必要时(例如,打开一次性子窗口时)创建其他 NSWC 的实例。
  • 使用[mycontroller showWindow:nil]在前面显示关联的窗口。如果您希望窗口显示为工作表,请使用类似以下内容的内容:

    NSWindowController* mycontroller = [[MyController alloc] init];
    [NSApp beginSheet: [mycontroller window]
    modalForWindow: [self window]
    modalDelegate: self
    didEndSelector: @selector(didEndMySheet:returnCode:contextInfo:)
    contextInfo: nil];

didEndSelector:应该是父窗口NSWC的一个方法,可以通过[sheet windowController]访问和释放'mycontroller'。- 要关闭窗口,请调用 NSWC 窗口的 performClose: 方法。

一些问题:

  • MainMenu 窗口的 NSWC 也应该是应用程序委托(delegate),还是应该是不同的类?
  • 同样,主 NSWC 应该处理文件(拖放和打开),还是应该将其传递给应用程序委托(delegate),或者这只是一个品味问题?

如果这是不好的做法,或者根本就是错误的,请纠正我。我希望澄清我对 NSWindowController 的理解,因此任何补充(以最佳实践、经验、陷阱的形式)将不胜感激。

谢谢,劳里

最佳答案

窗口 Controller 的实际用途是什么?

窗口 Controller 是从 NIB 文件加载窗口并管理 NIB 中分配的资源内存的工具。在此之前,NSWindowControllers 基本上必须为每个窗口编写相同的代码或发明一个自己的窗口 Controller 类。

当然,它们也是模型/ View / Controller 意义上的 Controller ,因此它们是将窗口中的 View 连接到模型对象的正确位置。为此,它们通常需要充当 View 对象的委托(delegate)或数据源。所以你完全正确地理解了这一部分。

窗口 Controller 也是代码重用的工具。它可以轻松地将窗口 Controller 类及其 XIB/NIB 拖放到另一个项目中并在那里使用它。

所以,是的,NIB 中的每个窗口都应该由窗口 Controller 拥有,但有一个异常(exception)。实际上,这只是良好代码的指南,没有任何强制措施。

WindowController 和 MainMenu.xib

MainMenu.xib 是不同的东西,在那里你不能使用窗口 Controller 。该 NIB 由 NSApplication 加载,因此必须是它的“文件所有者”。无法在 NSApplication 和 NIB 之间获取窗口 Controller 。也没有必要使用窗口 Controller 进行内存管理,因为应用程序对象在程序的整个运行时都存在,因此在释放它时不必从 NIB 中清除其资源。

如果您确实需要主窗口的窗口 Controller ,则不能将其放入 MainMenu.xib 中。

我希望这会有所帮助。关于窗口 Controller 可能还有很多话要说

关于cocoa - NSWindowController理解澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3683349/

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