窗口NSWindow

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了窗口NSWindow相关的知识,希望对你有一定的参考价值。

参考技术A 可以接收输入事件(键盘,鼠标,触控板等外设)的窗口对象称为keyWindow;当前的活动窗口也称为mainWindow。一个时刻只能有一个keyWindow和一个mainWindow。keyWindow和mainWindow可以是同一个窗口,也可以是不同的窗口。当mainWindow可以接收输入事件时,它同时也是keyWindow。
NSPanel类型的window不能做为mainWindow,只能做为keyWindow。一些常用的子类有NSColorPanel(颜色选择),NSFontPanel(字体选择),NSSavePanel(保存打开文件)

当有多个window在屏幕上时,用户可以点击切换到任何一个窗口上。有些特殊场景需要限制用户只能处理完当前的窗口的任务,只有关闭或处理完这个窗口才能继续操作其它的window。因此引入了模态窗口的概念。

有2种创建模态窗口的方法:

1.Modal windows
这种window比较霸道,当它启动后,此时只有这个window可以接收响应用户操作,无法切换到其他窗口操作,其他窗口也不能接收处理系统内部的各种事件。

使用NSApplication的runModalForWindow方法来创建Modal window

使用stopModal方法来结束模态。

2.Modal sessions
比起Modal windows,Modal sessions方式创建的window稍微温和一些,允许响应快捷键和系统菜单,比如字体颜色选择这些panel面板.

启动Modal sessions 窗口

使用sessionCode做为参数来关闭Modal sessions 窗口

注意任何一种模态窗口,都必须调用结束模态的方法去结束模态。如果点击了window左上角的关闭按钮,而没有执行结束模态的方法。整个系统仍然处于模态,其他窗口无法正常工作。

使用NSWindow类创建窗口对象,除了frame参数,还需要制定styleMask来确定窗口样式风格。

1.styleMask: 按位表示的窗口风格参数

2.backing:窗口绘制的缓存模式

3.defer:表示延迟创建还是立即创建

1.窗口居屏幕中心显示

2.前置显示窗口并且是其成为keyWindow

3.前置显示窗口

4.后置窗口,改变其在屏幕上的顺序

5.从屏幕上移除,隐藏窗口

当窗口状态变化时候,系统会发出相关通知消息。

比如说有多个窗口来回切换操作,2个窗口之间会有业务影响,一个窗口的界面数据修改会影响另外一个窗口的界面数据。可以注册NSWindowDidBecomeMainNotification,NSWindowDidBecomeKeyNotification消息,当窗口每次接收到这个消息可以重新获取数据刷新界面。

注册关闭窗口的消息通知,可以在窗口关闭前完成一些资源释放,提醒用户有变化的数据是否需要保存等。

查看NSWindow.h头文件,有2个重要的属性说明一下

通过xib设计window元素布局的话,直接从控件库拖上去就行了。在运行过程中要动态增加view元素到NSWindow的话,使用window的contentView,它代表了window的根视图。

有2种方法改变NSWindow的contentView

1.可以使用自定义的NSView或NSViewController的view,增加到contentView

2.OSX 10.10系统及以后,创建一个NSViewController子类,实例化后赋值给NSWindow的contentViewController。

参考自《MacOS应用开发基础教程》

如何打开 NSWindow 并选择窗口并获得焦点?

【中文标题】如何打开 NSWindow 并选择窗口并获得焦点?【英文标题】:How do I open an NSWindow and have the window selected and in focus? 【发布时间】:2010-05-12 10:02:56 【问题描述】:

我正在尝试使用以下代码打开一个 NSWindow:

NSWindowController *window = [[NSWindowController alloc] initWithWindowNibName:@"MainWindow"];
[window showWindow:nil];

窗口可以正常打开,但前一个窗口仍然是主窗口并处于焦点位置。我尝试了以下代码来强制主窗口,但它不起作用。该窗口仍然有一个禁用的标题栏,并且不接受关键事件等。

[self.window makeKeyAndOrderFront:self];
[self.window makeMainWindow];

我似乎能够让前一个窗口失去焦点的唯一方法是如果我在调用 showWindow: with [[NSApp mainWindow] close]; 后关闭窗口;

有什么想法吗?

【问题讨论】:

不知道为什么我在这里收到 -1,有人告诉我如何改进这个问题吗? 【参考方案1】:

makeKeyAndOrderFront: 是要走的路。你确定self.windowwindow 指的是同一个对象吗?

【讨论】:

谢谢,但还是不行。我添加了 [window makeKeyAndOrderFront:self];在 showWindow: 之后直接调用它仍然不起作用。我应该在其他地方调用它吗? makeKeyAndOrderFront: 是正确的方法。你在哪里调用它应该无关紧要。还有别的问题。例如,主窗口可能是模态的,或者某些东西拒绝放弃第一响应者状态。 是的,笔尖有问题,请参阅我的解决方案。 这与 showWindow 一起工作得很好:一旦笔尖设置正确。 @TylerA。请参阅下面的答案【参考方案2】:

我通过将 WindowController 分配给 nib 文件所有者解决了这个问题,而不是在 nib 中使用单独的 NSWindowController 对象。

【讨论】:

我想补充一点,我忘记在 Interface Builder 中将窗口插座连接到我的 NSWindow。这导致代码对我不起作用,所以对于阅读本文的任何人,不要忘记连接窗口插座。一个简单的错误,但会让你沮丧多年,哈哈 显然是一个非常古老的答案,但是如果有人可以将这句话翻译成它的样子(与我认为它应该看起来的相反,这显然是错误的,因为它没有工作),这将是非常有帮助的。

以上是关于窗口NSWindow的主要内容,如果未能解决你的问题,请参考以下文章

双击透明 NSWindow 标题不会最大化窗口

如何以编程方式关闭全屏模式NSWindow?

NSLayoutConstraint 防止 NSWindow 调整大小

在 Swift 中打开一个关闭的 NSWindow 会导致应用程序崩溃

如何使 NSWindow 中的按钮在工作表上时可点击

NSWindow 和 setLevel,不能让“顶部”功能正常工作