NSPopover не закрывается

Я пытаюсь сделать это, если пользователь щелкает значок меню, чтобы показать всплывающее окно, которое закрывается, если пользователь щелкает в любом месте, кроме всплывающего окна. Я установил переходное поведение, но это не то, что я думал.

Теперь, если пользователь щелкнет где-нибудь на всплывающем окне, переведя на него фокус, пользователь может щелкнуть где-нибудь еще на экране, и всплывающее окно закроется. Если бы я мог сфокусироваться на всплывающем окне, я думаю, это решило бы и мою проблему. К сожалению, я тоже не знаю, как это сделать.

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))

    }
}

person John Pollard    schedule 13.04.2015    source источник


Ответы (5)


Свифт 5:

NSApplication.shared.activate(ignoringOtherApps: true)

Добавьте это прямо перед тем, как открыть всплывающее окно

NSApplication.sharedApplication().activateIgnoringOtherApps(true)

Спасибо этому парню!

person John Pollard    schedule 14.04.2015

Свифт 5.1

Проблема в том, что окно PopOver не становится ключевым, чтобы исправить это, просто заставьте его стать ключевым сразу после его показа. Например, предположим, что pop — это NSPopOver:

pop.show(relativeTo: button.bounds, of: button, preferredEdge: .minY)
pop.contentViewController?.view.window?.makeKey()
person vauxhall    schedule 05.01.2020
comment
Работал на меня. Перед этим я добавил монитор событий, который показался мне чрезмерным. - person Manngo; 04.09.2020

Я столкнулся с точно такой же проблемой, ни один из ответов не работает для меня. Но я попробовал комбинацию, показанную ниже, которая работает безупречно.

        self.popover.behavior = NSPopover.Behavior.transient
        NSApp.activate(ignoringOtherApps: true)
        self.popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)
person Gurhan Polat    schedule 22.12.2020

Я не рекомендую использовать свойство поведения поповера. Лучше обрабатывать это в своем приложении. посмотрите, как это делается по этой ссылке, я ответил почти на ту же проблему. Поведение всплывающего окна Xcode Swift OS X

person Nasim Saleh    schedule 20.12.2015
comment
Можете ли вы объяснить, почему вы не рекомендуете использовать свойство поведения всплывающего окна? - person JZAU; 08.07.2017

С дополнением к ответу Джона Полларда

Если вы используете Swift 4+, добавьте этот код перед отображением всплывающего окна:

NSApplication.shared.activate(ignoringOtherApps: true)
person Avi L    schedule 06.02.2018