2016-07-07 6 views
4

Я создаю свой собственный подкласс NSApplication и нахожусь в блокпосте. Вот моя реализация метода run().NSWindow не закрывается при создании с помощью пользовательского NSApplication

override func run() { 
    finishLaunching() 
    repeat { 

     let event = nextEventMatchingMask(0xfffffffffffffff, untilDate: NSDate.distantPast(), inMode: NSDefaultRunLoopMode, dequeue: true) 
     if event != nil { sendEvent(event!) } 
     updateWindows() 

    } while true 

} 

В моей main.swift я это:

let myApp: MyApplication = MyApplication.sharedApplication() as! MyApplication 

let window = NSWindow(contentRect: NSMakeRect(0, 0, 100, 100), styleMask: NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask , backing: .Buffered, defer: false) 
window.makeKeyAndOrderFront(nil) 

myApp.run() 

Причина, почему я 0xfffffffffffffff вместо Int(NSEventMask.AnyEventMask.rawValue) потому, что последний перетоков при преобразовании из UInt64 в Int.

Проблема заключается в том, что когда я нажимаю красную кнопку закрытия, окно не закрывается, и когда я выбираю «Выход» из меню значка док-станции, он не уходит. Почему это происходит?

EDIT: Та же проблема обсуждается в this answer.

EDIT 2: Я создал Objective-C версии этого кода, и все работает отлично. Я подозреваю, что проблема в том, что я не могу использовать NSAnyEventMask в Swift.

ответ

0

Я, кажется, решил проблему. В Objective-C я могу просто использовать это, и мое приложение будет отвечать на элемент quit в меню док-станции.

NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask 
            untilDate:nil 
             inMode:NSDefaultRunLoopMode 
             dequeue:YES]; 

В Swift, если вы пытаетесь получить следующее событие, как, что вы могли бы сделать это:

let event = nextEventMatchingMask(Int(NSEventMask.AnyEventMask.rawValue), 
            untilDate: NSDate.distantPast(), 
            inMode: NSDefaultRunLoopMode, 
            dequeue: true) 

Однако, вы получите ошибку переполнения при преобразовании из UInt64 в Int. Это кажется непреднамеренным. Сначала я попытался решить эту проблему, заменив ее на 0xfffffffffffffff. Это отлично работает, и приложение будет реагировать на события. На самом деле этого было недостаточно. Приложение также должно отвечать на события, соответствующие маске 0x1. Я понятия не имею, почему, но это позволяет мне уйти и скрыть свое приложение из меню док-станции. (0x0 только позволяет мне бросить курить.)

Итак, вся run() реализация подкласса Swift NSApplication это:

override func run() { 
    finishLaunching() 
    setValue(true, forKey: "running") 

    while true { 
     let event = nextEventMatchingMask(0xfffffffffffffff, untilDate: NSDate.distantPast(), inMode: NSDefaultRunLoopMode, dequeue: true) 
     let dockEvent = nextEventMatchingMask(0x1, untilDate: NSDate.distantPast(), inMode: NSDefaultRunLoopMode, dequeue: true) 

     if dockEvent != nil { sendEvent(dockEvent!) } 
     if event != nil { sendEvent(event!) } 

     if !running { break } 

     updateWindows() 
    } 
} 
1

Вы должны только повторять пока self.running. Это может объяснить, почему ваше приложение не уходит. Если ваше приложение настроено на выход, когда закрывается его последнее окно, оно также может объяснить, почему ваше окно не закрывается. Рамки, возможно, не захотят отдельно закрыть окно, если все приложение собирается уйти, так или иначе.

+0

Проблема заключается в том, что это делает, это не делает его запустить. Я не могу явно указать 'running' без вызова' super.run() ' –

+0

Хмм. Да, я вижу, что старый [образец кода GLUT] Apple (https://developer.apple.com/legacy/library/samplecode/glut/Listings/GLUTApplication_m.html) прибегал к прямому настройке переменной экземпляра '_running' суперкласса, которая Скорый, вероятно, не позволит. Итак, вы можете попробовать использовать KVC для этого: 'setValue (true, forKey:« running »)'. –

+0

Я честно никогда не слышал об этом раньше, не могли бы вы поместить это в образец кода? Вставка того, что вы положили, не работает. - Никогда не помню, что я сказал, однако это syill не работает. –

Смежные вопросы