2016-09-21 2 views
0

Wie der Titel sagt, wenn mein Statusleistenmenü geöffnet ist und ein NSAlert von einem anderen Thread ausgelöst wird, friert die Benutzeroberfläche ein.NSAlert wird angezeigt, während NSMenu geöffnet ist, bewirkt, dass die Benutzeroberfläche einfriert

Vermutlich liegt das daran, dass beide Dinge auf dem Hauptthread laufen. Aber da ich mit einem NSAlert und einem NSMenu zu tun habe, habe ich nicht , um diese auf dem Hauptthread laufen zu lassen?

NSAlert-Code

func showWallpaperUpdateErrorAlert(messageText: String, informativeText: String) { 
    DispatchQueue.main.async { 
     NSApp.activate(ignoringOtherApps: true) 

     let updateErrorAlert = NSAlert() 
     updateErrorAlert.messageText = messageText 
     updateErrorAlert.informativeText = informativeText 
     updateErrorAlert.addButton(withTitle: "OK") 
     updateErrorAlert.runModal() 
    } 
} 

NSMenu-Code

func createStatusBarMenu() { 
    // Status bar icon 
    guard let icon = NSImage(named: "iconFrame44") 
     else { NSLog("Error setting status bar icon image."); return } 
    icon.isTemplate = true 
    statusBarItem.image = icon 

    // Create Submenu items 
    let viewOnRedditMenuItem = NSMenuItem(title: "View on Reddit...", action: #selector(viewOnRedditAction), keyEquivalent: "") 
    viewOnRedditMenuItem.target = self 

    let saveThisImageMenuItem = NSMenuItem(title: "Save This Image...", action: #selector(saveThisImageAction), keyEquivalent: "") 
    saveThisImageMenuItem.target = self 

    // Add to title submenu 
    let titleSubmenu = NSMenu(title: "") 
    titleSubmenu.addItem(descriptionMenuItem) 
    titleSubmenu.addItem(NSMenuItem.separator()) 
    titleSubmenu.addItem(viewOnRedditMenuItem) 
    titleSubmenu.addItem(saveThisImageMenuItem) 

    // Create main menu items 
    titleMenuItem = NSMenuItem(title: "No Wallpaperer Image", action: nil, keyEquivalent: "") 
    titleMenuItem.submenu = titleSubmenu 
    titleMenuItem.isEnabled = false 
    getNewWallpaperMenuItem = NSMenuItem(title: "Update Now", action: #selector(getNewWallpaperAction), keyEquivalent: "") 
    getNewWallpaperMenuItem.target = self 

    let preferencesMenuItem = NSMenuItem(title: "Preferences...", action: #selector(preferencesAction), keyEquivalent: "") 
    preferencesMenuItem.target = self 

    let quitMenuItem = NSMenuItem(title: "Quit Wallpaperer", action: #selector(quitAction), keyEquivalent: "") 
    quitMenuItem.target = self 

    // Add to main menu 
    let statusBarMenu = NSMenu(title: "") 
    statusBarMenu.addItem(titleMenuItem) 
    statusBarMenu.addItem(NSMenuItem.separator()) 
    statusBarMenu.addItem(getNewWallpaperMenuItem) 
    statusBarMenu.addItem(NSMenuItem.separator()) 
    statusBarMenu.addItem(preferencesMenuItem) 
    statusBarMenu.addItem(quitMenuItem) 

    statusBarItem.menu = statusBarMenu 

    statusBarMenu.delegate = self 
} 
+0

Hallo, was ist Ihre OS X-Version? Ist es os x 10.12 (Sierra)? – DoN1cK

+0

Ja, ich bin in Sierra. – yesthisisjoe

Antwort

1

In meinem Fall war die Lösung um das Menü zu schließen, bevor die Warnung zeigt.

Ich hatte das Menü aus der NSStatusItem ‚s menu Eigenschaft zuzugreifen und rufen cancelTrackingWithoutAnimation() (regelmäßige cancelTracking() nicht so glatt war). Ich musste das auch außerhalb des Hauptthreads tun, aus welchen Gründen auch immer.

func showWallpaperUpdateErrorAlert(messageText: String, informativeText: String) { 
    statusBarItem.menu?.cancelTrackingWithoutAnimation() // This is new 

    DispatchQueue.main.async { 
     NSApp.activate(ignoringOtherApps: true) 

     let updateErrorAlert = NSAlert() 
     updateErrorAlert.messageText = messageText 
     updateErrorAlert.informativeText = informativeText 
     updateErrorAlert.addButton(withTitle: "OK") 
     updateErrorAlert.runModal() 
    } 
} 
+0

es macht den Job. – DoN1cK

Verwandte Themen