相关疑难解决方法(0)

NSWindowController澄清理解

我曾经多次在项目中使用过NSWindowController,感觉我对这个重要课程背后的概念有了非常粗略的把握.我想对这篇文章做的是澄清/纠正我自己的理解,并希望帮助其他学习者迈出理解的第一步.这是我发现最有用的一目了然的概念,概述和最佳实践,并且通常缺少文档.这是我对NSWindowController的看法(问题以粗体点缀):

  • NSWindowController(NSWC)子类(概念上)存在于每个窗口笔尖下方,充当用户界面元素与它们控制/表示的模型对象之间的粘合剂.基本上,应用程序中的每个窗口都应该有自己的NSWC子类.
  • nib的文件所有者应始终是NSWC的子类.即使是MainMenu.xib应用程序也是如此?
  • NSWC window属性应始终链接到InterfaceBuilder中的NSWindow.
  • 你应该使用覆盖'init'方法,[super initWithWindowNibName:]这样当你引用[mycontroller window]它时会加载nib.对于MainMenu.xib窗口的NSWC,情况也是如此,即使这是在启动时打开的吗?
  • NSWC不应该做太多繁重的工作 - 它应该只是将消息传递给对象的实例,并在UI中呈现这些对象.
  • 它可以使用绑定来修改UI,或者作为表等的委托来修改UI,或者通过在观察到更改时主动更改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];
    
    Run Code Online (Sandbox Code Playgroud)

didEndSelector:应该是父窗口的NSWC的方法,并且可以访问和释放"myController的"带[sheet windowController].- 要关闭窗口,请调用performClose:NSWC窗口的方法.

一些问题:

  • MainMenu窗口的NSWC是否也应该是应用程序代表,还是应该是不同的类?
  • 同样,主要的NSWC应该处理文件(拖放和打开),还是应该传递给应用代表,还是仅仅是品味问题?

请纠正我,如果这是不好的做法,或者是完全错误的.我希望澄清我对NSWindowController的理解,所以任何添加(以最佳实践,经验,陷阱的形式)都将受到高度赞赏.

谢谢,劳里

cocoa nswindowcontroller cocoa-sheet

40
推荐指数
2
解决办法
9044
查看次数

标签 统计

cocoa ×1

cocoa-sheet ×1

nswindowcontroller ×1