【问题标题】:How to implement my own pop-up control in Cocoa?如何在 Cocoa 中实现我自己的弹出控件?
【发布时间】:2014-01-13 20:51:00
【问题描述】:

我想为我的 NSWindow 制作一个自定义的自动完成控件,有点像 Xcode 的花哨的控件,但我不知道怎么做。

我用自己的 NSWindowController 制作了一个 NSPanel,并用如下代码显示它:

_popupController = [[MYPopupWindowController alloc] initWithWindowNibName: @"MYPopupPanel"];
NSPanel *popup = [_popupController window];
[popup setFrameTopLeftPoint: ...];  // location of the cursor
[popup setLevel: NSPopUpMenuWindowLevel];
[_window addChildWindow: popup ordered: NSWindowAbove];
[_popupController showWindow: sender];

NSPanel 本身有自己的子类,它实现了-canBecomeKeyWindow(返回YES),这样弹窗中的NSTableView 就可以接收到按键事件了。

这很好用。我唯一遇到的问题是,当我的 NSPanel 是关键窗口时,主应用程序 NSWindow 不是(显然),这会导致红色/黄色/绿色窗口控件变暗。显然,在像 Xcode 这样的程序中,窗口控件不会在您每次开始键入方法名称时变暗。

我是不是找错树了? NSPanel 是制作自定义弹出控件的错误方法吗?或者有什么方法可以使 NSPanel 成为关键窗口,而其父窗口(或其他窗口)不会使其窗口控件变暗?

编辑:有什么方法可以找出 Xcode 实际使用的是什么,比如它是否是 NSPanel?

【问题讨论】:

    标签: cocoa popup nswindow nspanel


    【解决方案1】:

    尝试将NSNonactivatingPanelMask 标志添加到您的NSPanel 样式(如果您使用xib,只需在属性检查器中设置“非激活”复选框)。

    【讨论】:

    • 这是一个有用的东西(谢谢!),但这不是导致问题的原因。出于某种原因,即使 NSPanel 不是-canBecomeKeyWindow,它仍然会接受键盘事件(当然不会弄乱父窗口的控件)。我不确定我是否了解 Cocoa 响应者链,但它现在可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多