2015-09-20 2 views
0

Для моего небольшого приложения Mac menubar я бы хотел, чтобы поведение popover было временным, поэтому, когда он теряет фокус, он будет закрыт. Это работает для этого:Xcode Swift OS X popover behavior

popover.behavior = NSPopoverBehavior.Transient 

Но это работает только один раз, поэтому во второй раз щелчок где-нибудь еще в поповер пребывания. Я поместил код в func applicationDidFinishLaunching(notification: NSNotification), но его размещение вне этой функции внутри класса не работало. Как я могу использовать силу такого поведения все время?

Я использую Xcode 7.0 с Swift (2.0).

ответ

2

Лучше оставить поведение по умолчанию значением NSPopoverBehaviorApplicationDefined и реализовать необходимую функцию для его обработки. Поскольку, как говорится в документации Apple, обстоятельства двух других типов поведения не ясны. Вы можете сделать следующее:

detector = NSEvent.addGlobalMonitorForEventsMatchingMask([NSEventMask.LeftMouseDownMask, NSEventMask.RightMouseDownMask], handler: { [weak self] event in 
       self?.hidingFunction() 
      }) 

это регистрирует montior в глобальное событие, когда левый/правый клик выполняется
Теперь вы реализуете hidingFunction() в том же классе вы сделали вышеупомянутый вызов в качестве обработчика был указан как «я».
Эта функция закрывает поповер и и удалить монитор создан

func hidingFunction(){ 
popover.close() 
if let temp: AnyObject = detector { // using if let to be sure it was intialized 
    NSEvent.removeMonitor(temp) 
} 

детектор просто имя переменной вы можете назвать это все, что вы хотите определить его, прежде чем в верхней части класса как тип любого объекта

var detector: AnyObject? 
0

Обновление для Swift 3

var detector: Any? 

detector = NSEvent.addGlobalMonitorForEvents(matching:[NSEventMask.leftMouseDown, NSEventMask.rightMouseDown], handler: { [weak self] event in 
     self?.hidingFunction() 
    }) 

func hidingFunction() { 
    popover.close() 
    if let temp: Any = detector { // using if let to be sure it was intialized 
     NSEvent.removeMonitor(temp) 
    } 
}