我正在努力使,如果用户点击菜单图标,以显示弹出关闭,如果用户点击任何地方,但弹出关闭。我将行为设置为瞬态,但这并不是我想的那样。
现在,如果用户单击弹出窗口上的某个位置,将焦点带到该弹出窗口上,则用户可以单击屏幕上的其他位置,弹出窗口将关闭。如果我可以强制将焦点放在popover上,我想这也可以解决我的问题。不幸的是,我也不知道该怎么做。
class AppDelegate: NSObject, NSApplicationDelegate {
let view : NSView!
let statusItem: NSStatusItem
let popover: NSPopover
let button : NSButton!
override init() {
statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-1)
if let statusButton = statusItem.button {
appStatusButton = statusButton
statusButton.image = NSImage(named: "icon128off")
statusButton.alternateImage = NSImage(named: "icon128")
statusButton.action = "onPress:"
}
popover = NSPopover()
popover.animates = false
popover.contentViewController = ViewController()
popover.behavior = .Transient
}
}这是视图控制器
class ViewController: NSViewController, WKNavigationDelegate{
var webView : WKWebView!
override func loadView() {
view = NSView()
view.translatesAutoresizingMaskIntoConstraints = false
view.addConstraint(NSLayoutConstraint(
item: view, attribute: .Width, relatedBy: .Equal,
toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 580))
view.addConstraint(NSLayoutConstraint(
item: view, attribute: .Height, relatedBy: .Equal,
toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 425))
}
}发布于 2015-04-14 20:40:40
Swift 5:
NSApplication.shared.activate(ignoringOtherApps: true)在打开弹出窗口之前添加此内容
NSApplication.sharedApplication().activateIgnoringOtherApps(true)感谢this guy!
发布于 2020-01-06 01:46:18
Swift 5.1
问题是弹出窗口没有变成key,要解决这个问题,只需在显示之后强制它变成key即可。例如,假设pop是一个NSPopOver
pop.show(relativeTo: button.bounds, of: button, preferredEdge: .minY)
pop.contentViewController?.view.window?.makeKey()发布于 2020-12-23 01:02:43
我也遇到过同样的问题,没有一个答案对我有效。但我尝试了下面显示的组合,这是完美无瑕的
self.popover.behavior = NSPopover.Behavior.transient
NSApp.activate(ignoringOtherApps: true)
self.popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)https://stackoverflow.com/questions/29612628
复制相似问题