问题标签 [nspanel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - 如何在仍接收点击事件的同时使 OS X 应用程序无法聚焦?
我正在为 OS X 开发一个屏幕键盘应用程序,类似于操作系统内置的应用程序(键盘查看器)。我似乎碰壁了,因为我不确定如何接受按钮的点击事件而不是从当前激活的应用程序中窃取焦点。我知道这是可能的,因为有些应用程序已经这样做了,例如 AssistiveWere 的 KeyStrokes。
所以我的问题是:如何让我的窗口接收鼠标事件并在不被激活的情况下处理它们?
PS 我在 OS X 开发方面不是很有经验,这是我的第一个 Swift 项目,如果这是一个微不足道的问题,请原谅。
objective-c - 辅助 NSPanel 改变父窗口工具栏分隔符的颜色
当我有一个NSWindow
带有工具栏和一个辅助NSPanel
的时,当面板成为键时,主窗口的工具栏分隔符变为黑色:
为什么会出现这种情况?如果我使用 anNSWindow
而不是NSPanel
. 我在优胜美地(10.10.5)上对其进行了测试。
macos - 在 Xcode 8 中删除了 NSPanel?
过去我可以在 Interface Builder 的库中找到可用的面板,但在 Xcode 8 中,我在情节提要编辑器中搜索了整个库,没有可用的面板。Apple 刚刚删除NSPanel
还是我有问题?
objective-c - 悬停在 URL 链接上时如何实现弹出窗口
我对 Cocoa 应用程序比较陌生。在我的应用程序 (MacOS) 中,如果文本包含图像 url 链接,我已经标记了它。我现在正在尝试做的是,当鼠标悬停(不点击)链接时,应用程序将打开一个 NSPanel(对不起,如果它不准确)并显示图像 url 的内容。此外,当鼠标移出文本时,面板/窗口将自动关闭。
我已经尝试过诸如“浮动窗口/面板/quicklook”之类的东西,但搜索结果并不接近我想要的。谁能给我一些关键字,以便我自己尝试找到解决方案?谢谢你。
objective-c - 当按 Escape 关闭 NSPanel 时,为什么我的应用程序会崩溃?
我的应用程序中有一个 NSPanel,main()
只要按 Escape 键关闭它,它就会使应用程序崩溃(EXC_BAD_ACCESS in )。以任何其他方式关闭它(文件>关闭,Cmd-W,单击红色关闭按钮)工作正常。
该面板通过从情节提要中实例化其窗口控制器来显示。对窗口控制器的引用存储在字典中。在视图控制器-viewWillDisappear
中,窗口控制器已从字典中删除。
关闭时:
崩溃显然是通过从字典中删除窗口控制器触发的。如果我保留它,它就不会崩溃。
一些进一步的信息:
- 该面板包含(仅)一个 WebView。
- 面板的“关闭时释放”复选框已关闭。
- 所有其他选项均为默认选项(启用时隐藏停用除外。)
我找不到调试器的问题,因为崩溃发生在 main() 中,即。窗户关闭后。
知道是什么原因造成的吗?
而且,更一般地说,我应该使用哪种技术来调试这种情况?
2018 年 2 月 19 日更新:
启用僵尸让我得到了消息-[NSWindowController setNextResponder:]: message sent to deallocated instance 0x60000028a9b0
。因此,在窗口控制器发布后,某些东西正在与窗口控制器对话。因为那不是我的直接代码(我什至没有继承 NSWindowController,也没有在任何地方对窗口控制器进行任何调用),所以问题仍然存在:与其他方法相比,通过点击 Escape 关闭窗口有什么不同(像 Cmd-W)?
2018 年 2 月 19 日更新 #2:
Instruments 给出了一个有趣的结果。显然,我在面板上的 WebView 尝试在面板关闭/解除分配后处理 Escape 键的按下(在我的情况下由视图控制器的触发-viewDidDisappear
。)
Zombie 源是-[WebResponderChainSink detach]
,由 调用(通过一些中间调用)-[WebHTMLView keyDown:]
。
看起来 WebView 没有正确传递按键或其他东西......?这是否意味着面板上的 WebView 是个坏主意?
objective-c - 无法在服务应用程序的 NSTableView 中选择行
我真的要疯了。
我有一个服务应用程序,它打开一个非常简单的NSPanel
它由一个NSTableView
、一个标签和三个NSButton
控件组成。
而已。
表视图是基于视图的,有四种不同的NSTableCellView
在 IB 中定义了四个不同的行。
表格代码非常简单;我的NSWindowController
子类既是数据源又是委托。在大多数情况下,一切都很完美:
- 窗口打开
- 预期的数据源方法(
numberOfRowsInTableView:
和tableView:objectValueForTableColumn:row:
) 被调用 tableView:isGroupRow:
表格通过和填充其视图和部分分隔符tableView:viewForTableColumn:row:
- 空选择被禁用,因此委托立即收到
tableView:shouldSelectRow:
消息,表格自动选择第一行 - 表格完全按照应有的方式显示,并且第一行被选中
一切看起来都很完美,但我无法选择不同的行。我在表格中单击的任何内容都不会更改选择。
我努力了:
- 子类化
NSTableCellView
并验证它正在接收hitTest:
呼叫 - 尝试“破解”表格单元格视图
hitTest:
,使其始终返回nil
- 在表格单元格视图内的控件视图上尝试了“拒绝第一响应者”、“启用”、“可编辑”属性的各种组合
- 尝试删除所有控制视图。所以表格单元格视图是空的
- 尝试实施
tableView:selectionIndexesForProposedSelection:
而不是tableView:shouldSelectRow:
- 将其更改
NSPanel
为常规NSWindow
似乎没有任何区别。我在表格中单击的任何内容都不会更改选择,并且我的表格视图委托永远不会收到另一个tableView:shouldSelectRow:
呼叫。
请注意,NSButton
窗口中的所有其他 ( ) 控件都可以正常工作。我可以点击其中任何一个。
更新#1
根据评论,我尝试将产品更改为普通旧的.app
,但这没有任何区别。
我的下一步是更多地使用委托方法,并将问题缩小到:
如果我实现
tableView:shouldSelectRow:
,表调用我的委托方法两次(因为我关闭了“空选择”,表必须首先确定默认选择哪一行,所以我得到两个调用,一个用于第 0 行(NO)和一个第 1 行的第二个(是))。但是,如果我在表格中单击,我永远不会收到另一个tableView:shouldSelectRow:
.如果我删除 的实现
tableView:shouldSelectRow:
,表选择就会神奇地开始工作。(除了您可以选择组行,这是磨损的事实。)还尝试实施
tableView:selectionIndexesForProposedSelection:
而不是tableView:shouldSelectRow:
; 相同的行为
因此,如果我实现任何委托方法来确定哪些行是可选的,我就无法选择任何行。叹
更新#2
我对应用程序进行了下注和重构,因此现在有一个新的视图控制器对象专门用于管理表视图(而不是重载窗口控制器)。所有数据模型和委托方法都移到了新的视图控制器中。
此外(认为 IB 中的表格视图可能有些奇怪),我从 NIB 中删除了表格视图并重新创建了它及其所有连接。
不幸的是,这些变化都没有任何区别。如果tableView:shouldSelectRow:
实现了,则该表不可用。删除该方法,它会再次起作用。
更新#3
而且它变得更奇怪了:我认为我可以“破解”行选择问题,我实现了表视图委托方法tableViewSelectionIsChanging:
和tableViewSelectionDidChange:
. 也不会被叫。即使我删除tableView:shouldSelectRow:
,允许表格选择工作,也没有收到tableViewSelectionIsChanging:
或tableViewSelectionDidChange:
收到过。
但是,如果我为NSTableViewSelectionIsChangingNotification
and添加观察者NSTableViewSelectionDidChangeNotification
,则会收到这些观察者。
另请注意,NSViewController
作为表视图的委托和数据源的子类明确符合<NSTableViewDelegate>
and <NSTableViewDataSource>
,因此不应该有任何理由让表视图对实现的委托方法感到困惑。
c# - 如何在最顶层的 NSPanel 中获取键盘事件?
我使用 Xamarin 创建了一个应用程序来帮助在线观看电影。它在所有其他窗口的顶部显示字幕。这是使用 完成的NSPanel
,因为它是使其在 MacOS Mojave 上工作的唯一方法。
该应用程序运行良好。现在我想通过NSPanel
响应键盘事件来改进应用程序,这样我就可以通过使用键盘来控制应用程序的暂停、播放、后退或前进。
如何在最顶层获取键盘事件NSPanel
?
我尝试使用此代码:
但它仅在应用程序未处于全屏模式时才有效。
完整的SubtitlesViewer-MACOS
项目可以在这里找到。
以下是创建面板的部分代码:
请建议我还应该尝试什么来使它起作用。
swift - MacOS:如何让 NSPanel 抵抗关键焦点(使用 becomeKeyOnlyIfNeeded?)
在 MacOS/Cocoa/Swift 4.2/Xcode 10.1 中,我试图创建一个浮动在我的文档窗口上的 NSPanel,作为与文档窗口中发生的(主要基于键盘的)编辑会话交互的轻量级标记调色板。
我在面板中主要有按钮控件,但是当用户单击它时,一个组合框值得关注。除此之外,我想避免成为关键窗口(避免捕获未来的关键事件并避免突出显示标题栏)当任何其他控件被按下时,或者当面板通过拖动重新定位时,或者面板点击时死角。这对我来说听起来与文档描述的行为完全一样,如果我的面板被标记为 becomeKeyOnlyIfNeeded,我应该有,但我无法让它工作。
在 Interface Builder 中,我将面板指定为(我自己的)子类 InspectorPanel,其样式为:常规面板、标题栏、阴影、关闭、可恢复和停用时隐藏设置(其他一切都清楚)。我在子类中指定了 becomeKeyOnlyIfNeeded:
(我也尝试将它设置在控制器的 awakeFromNib 中,在控制器的窗口中设置为?NSPanel。)
此设置似乎没有明显的效果。面板正确地漂浮在文档窗口上方,但是当组合框成功地从文档窗口中获取关键焦点时,按下任何控件、单击面板空白区域或拖动面板标题栏以及其他操作也是如此. 虽然我可以为每种情况编写处理程序,手动查找活动文档窗口并 makeKeyWindow(thatWindow) 将焦点传递回它所属的位置,但从检查器设计的角度来看,这似乎不优雅;强迫我写一些我目前不需要的处理程序(例如标题栏拖动);让我担心我错过的类似案例。
只有当我的单个组合框需要它时,是否有某种方法可以成功成为关键?如果是这样,怎么做?
其他努力:
我知道 needsPanelToBecomeKey 并且对其文档有些困惑。它表明,一旦我在面板上设置了 becomeKeyOnlyIfNeeded,NOTHING 将允许面板获取焦点,直到我在特定子视图(例如我的组合框)上启用 needsPanelToBecomeKey。实际上,由于设置 becomeKeyOnlyIfNeeded 对阻止窗口成为键没有任何影响,因此无论我是否在子视图上设置 comboBox.needsPanelToBecomeKey,我都看不出响应有什么不同。)
我也知道refusesFirstResponder,并尝试在面板中的各种控件(例如NSButtons)上设置它,看看这是否会阻止它们将关键焦点转移到窗口。没运气。)
如果我设置 canBecomeKeyWindow = false,那么即使在我的组合框中,我也不会获得关键焦点。(这似乎是合理且出乎意料的;我只是列出它是为了全面。)
许多其他应用程序似乎都有我想要的浮动窗口,但我没有找到可以帮助我找到错误的源代码。你能帮我吗?
cocoa - 在 Catalina 中,`orderFront:` 使应用程序成为活动应用程序;我该如何防止这种情况?
我有一个后台“监控”应用程序,它可以作为附件运行,也可以作为常规应用程序运行(用户选择取决于他们是否想在 Dock 中看到它)。
NSPanel
该应用程序有几个显示后台任务进度的永不键实用程序窗口。当后台任务启动时,窗口使用orderFront:
.
这多年来一直很有效。该窗口只会出现在活动应用程序后面的某个位置。
但是,从 Catalina (macOS 10.15) 开始,orderFront:
会导致我的监控应用程序变得活跃,从而从用户的应用程序中窃取焦点。
这很糟糕,我想阻止它,但我似乎无法弄清楚如何。
automation - 如何在 Applescript 中引用辅助功能检查器描述为“<empty description> (sheet) [NSPanel]”的窗口中的对象?
我正在编写一个脚本,它将运行一个 microsoft office 安装 DMG,然后单击继续,依此类推,直到安装该程序。我已经成功地浏览了我需要按下的按钮,直到我到达同意按钮。当我单击此按钮时,辅助功能检查器会显示“(表)[NSPanel]”。我怎样才能引用这个对象?有可能吗?