Loz*_*Loz 40 cocoa nswindowcontroller cocoa-sheet
我曾经多次在项目中使用过NSWindowController,感觉我对这个重要课程背后的概念有了非常粗略的把握.我想对这篇文章做的是澄清/纠正我自己的理解,并希望帮助其他学习者迈出理解的第一步.这是我发现最有用的一目了然的概念,概述和最佳实践,并且通常缺少文档.这是我对NSWindowController的看法(问题以粗体点缀):
window
属性应始终链接到InterfaceBuilder中的NSWindow.[super initWithWindowNibName:]
这样当你引用[mycontroller window]
它时会加载nib.对于MainMenu.xib窗口的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窗口的方法.
一些问题:
请纠正我,如果这是不好的做法,或者是完全错误的.我希望澄清我对NSWindowController的理解,所以任何添加(以最佳实践,经验,陷阱的形式)都将受到高度赞赏.
谢谢,劳里
Sve*_*ven 30
窗口控制器是从NIB文件加载窗口以及管理NIB中分配的资源的内存的工具.在那之前,NSWindowControllers
基本上必须为每个窗口编写相同的代码或发明自己的窗口控制器类.
当然,它们也是模型/视图/控制器意义上的控制器,因此它们是将窗口中的视图连接到模型对象的正确位置.为此,他们通常需要充当视图对象的委托或数据源.所以你完全正确地得到了这个部分.
窗口控制器也是代码重用的工具.它可以很容易地将窗口控制器类和它的XIB/NIB放入另一个项目并在那里使用它.
所以是的,NIB的每个窗口都应该由一个窗口控制器拥有,但有一个例外.实际上,这只是良好代码的准则,没有任何强制执行.
MainMenu.xib
是一个不同的东西,你不能使用窗口控制器.这个NIB被加载,NSApplication
所以这必须是它的"文件所有者".无法NSApplication
在NIB和NIB 之间获得窗口控制器.它也没有必要在那里使用窗口控制器来进行内存管理,因为应用程序对象存在于程序的整个运行时,因此它在解除分配时不必从NIB中清除它的资源.
如果你真的需要一个窗口控制器为你的主窗口,你不能把它放在MainMenu.xib
.
我希望这有帮助.关于窗口控制器可能还有很多话要说
即使是MainMenu.xib应用程序也是如此?
不,MainMenu nib由NSApplication拥有(即加载它的人).
对于MainMenu.xib窗口的NSWC,情况也是如此,即使这是在启动时打开的吗?
不,NSApplication根据您的应用程序文件的"NSMainNibFile"属性加载主nib.(它恰好在模板Xcode项目中预先设置为"MainMenu".)如果要更改其名称,请在那里更改它(并重命名您的nib文件).(顺便说一句:此属性也可以在Xcode 4中的目标的"摘要"视图中更改.)
MainMenu窗口的NSWC是否也应该是应用程序代表,还是应该是不同的类?
NSMainNibFile nib的所有者是NSApplication的实例,它加载它并通过关联该实例的任何委托.这些都不是NSWC的子类.
同样,主要的NSWC应该处理文件(拖放和打开),还是应该传递给应用代表,还是仅仅是品味问题?
没有"主NSWC"(app/app-delegate是NSMainNibFile的控制器).
所有拖放操作都由NSWindow或NSView子类处理.我通常使用一个特殊的NSWindow或NSView子类,它只是将所有拖放方法传递给代理.例如:
- (unsigned int) draggingEntered:sender
{
return [[self delegate] draggingEntered:sender];
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我可以将所有窗口/视图代码保存在各自的控制器中(由其笔尖所有者确定).并且因为窗口/视图特定代码在控制器(而不是NSWindow/NSView子类)中,所以不同类型的NSWindows/NSView都可以使用相同的drag-n-drop子类.
归档时间: |
|
查看次数: |
9044 次 |
最近记录: |