2017-05-06 2 views
0

Ich versuche, meinen Anwendungsaufruf zu verbergen, wenn der Benutzer versucht, das letzte Fenster über den roten Knopf zu schließen.Unterscheiden zwischen NSWindow schließen und Multiple-Tab-NSWindow schließen?

Hinweis: Die unten aufgeführten Registerkarten sind Teil der automatischen Tab-Funktion von Sierra.

Ich bin mir bewusst, dass ich die Anwendung mit NSApplication.shared().hide() verstecken kann, aber ich möchte nur tun, wenn der Benutzer versucht hat, das letzte offene Fenster zu schließen (was bedeutet, die rote Schaltfläche, die alle Registerkarten für dieses Fenster schließen würde)). Ich möchte jedoch zulassen, dass die Schließen-Schaltflächen auf den Registerkarten normal ausgeführt werden, und die Registerkarte schließen.

Bis jetzt erscheinen eine Tab-Schließung und eine Fenster-Schließung in der API identisch und ich habe es schwer, das gewünschte Verhalten zu erreichen. Gibt es eine Möglichkeit zu bestimmen, ob das Schließen über die Schaltfläche "Schließen" oder das Schließen der Registerkarte erfolgt?

+0

Verbergen Sie nicht, wenn der Benutzer versucht, das letzte Fenster zu schließen. Die Schließen-Schaltfläche sollte schließen, nicht ausblenden. Beenden Sie nach dem Schließen des letzten Fensters oder deaktivieren Sie das Schließen des letzten Fensters oder das Ausblenden des Fensters, wenn die App nicht die vorderste App ist. – Willeke

+0

Ich bin etwas inspiriert von Finders Verhalten. Wenn Sie mehrere Registerkarten in Ihrem letzten Finder-Fenster haben, scheint das Schließen und erneute Öffnen dieses Fensters die Registerkarten beim erneuten Öffnen nicht zu beeinträchtigen. In Seiten und Safari sind jedoch alle Tabs beim Schließen ... bah! – orion

+0

Der Finder versteckt sich nicht, wenn ich das Fenster schließe. Es bleibt aktiv und die Front App. Der Finder stellt ein Fenster wieder her, wenn es aktiviert ist. Wie öffnest du ein Fenster im Finder? – Willeke

Antwort

0

Haftungsausschluss:

  • Ich habe nur mit Swift/Cocoa für ein paar Wochen gearbeitet.
  • Es gibt wahrscheinlich einen besseren Weg, dies zu tun.

So konnte ich keine einfache Möglichkeit finden, dies zu tun. Die Idee hinter meiner Implementierung besteht darin, eine entprellte Funktion aufzurufen, wenn ein Fenster geschlossen wird. Da das Klicken auf das "X" in der Ecke alle Fenster schließt, ermöglicht die Entprellung, dass Sie eine einmal aufgerufene Funktion aufrufen können, wenn alles fertig ist.

Es gibt noch andere Dinge: Sie müssen die Anzahl der Fenster in einem Tab zwischenspeichern. Sie müssen eine Liste der Fenster halten, die geschlossen werden.

Aber am Ende kann man unterscheiden zwischen:

  • Schließen mehrere Registerkarten in einem Fenster („Andere Tabs schließen“)
  • Schließen einer einzelnen Tabs in einem Fenster
  • schließen ein ganzes Fenster ein Fenster ohne Reiter von Registerkarten
  • Schließen

Sowieso ist hier meine Implementierung. Sie werden debounce from here brauchen:

// Stands for TabbedWindowCloseDebouncer 
class TWCDebouncer { 
    private static var Debouncers = [NSWindowTabGroup:() -> Void]() 
    private static var TabStartCounts = [NSWindowTabGroup: Int]() 
    private static var Windows = [NSWindowTabGroup: [NSWindow]]() 
    private static var LastTabGroup: NSWindowTabGroup? 

    func handleClose(window: NSWindow) { 
     // This handles a window without tabs. 
     // Check presence in Debouncers, otherwise it will also catch the last 
     // window of a tabbed window closing. 
     if window.tabbedWindows == nil && TWCDebouncer.Debouncers[window.tabGroup!] == nil { 
      // You can consider this to be the same as closing a whole window. 
      return 
     } 

     // This could probably lead to problems. 
     TWCDebouncer.LastTabGroup = window.tabGroup 

     // Store the initial tab count. 
     if TWCDebouncer.TabStartCounts[TWCDebouncer.LastTabGroup!] == nil { 
      TWCDebouncer.TabStartCounts[TWCDebouncer.LastTabGroup!] = window.tabbedWindows?.count 
     } 

     // Initialize the list of windows closing. 
     if TWCDebouncer.Windows[TWCDebouncer.LastTabGroup!] == nil { 
      TWCDebouncer.Windows[TWCDebouncer.LastTabGroup!] = [] 
     } 

     // Set up the debounced function. 
     if TWCDebouncer.Debouncers[TWCDebouncer.LastTabGroup!] == nil { 
      TWCDebouncer.Debouncers[TWCDebouncer.LastTabGroup!] = debounce(delay: .milliseconds(20), action: { 
       let countAfter = TWCDebouncer.LastTabGroup?.windows.count ?? 0 

       print(TWCDebouncer.Windows[TWCDebouncer.LastTabGroup!]) 
       if countAfter == 0 { 
        // All windows were closed. 
       } else { 
        // One or more windows were closed in the tab group 
       } 

       // Reset. 
       TWCDebouncer.Debouncers[TWCDebouncer.LastTabGroup!] = nil 
       TWCDebouncer.TabStartCounts[TWCDebouncer.LastTabGroup!] = nil 
       TWCDebouncer.Windows[TWCDebouncer.LastTabGroup!] = nil 
       TWCDebouncer.LastTabGroup = nil 
      }) 
     } 

     // Store the window. 
     TWCDebouncer.Windows[TWCDebouncer.LastTabGroup!]?.append(window) 
     // Call the debounced function. 
     TWCDebouncer.Debouncers[window.tabGroup!]!() 
    } 
} 

, es zu benutzen, ich habe es habe auf meiner WindowController. Ich musste es in windowShouldClose setzen, zu der Zeit windowWillClose heißt, window.tabbedWindows ist nil.

class WindowController: NSWindowController { 
    var closeDebouncer = TWCDebouncer() 

    func windowShouldClose(_ sender: NSWindow) -> Bool { 
     self.closeDebouncer.handleClose(window: self.window!) 
     return true 
    } 
} 
Verwandte Themen