Hi Ich habe diese Frage schon einige Male gesehen, aber noch keine definitive Antwort, also habe ich sie für xcode 7 und swift2 erstellt (was die Dinge vielleicht ein bisschen verändert hat).
Ich habe ein Projekt mit den Storyboards Xcode 7 und Cocoa OSX + swift2 erstellt, also startete mein Projekt mit einem NSWindowController , der (wie erwartet!) eine Verbindung zu einem NSViewController herstellt. Ich habe meinem Fenster-Controller eine NSToolbar hinzugefügt und der Symbolleiste einen NSButton hinzugefügt. Ich habe meinen NSViewController zu einem der neuen NSSsplitViewController geändert, der auf drei NSViewController s verweist und ihre Ansichten horizontal - mit vertikalen Teilern - anzeigt (ähnlich wie das Layout in der Foto App oder Seiten in Yosemite +). Mein endgültiges Ziel wird sein, dass die Schaltfläche in der Symbolleiste "Meine" die erste Teilung anzeigt und verbirgt.
Es ist mein Verständnis ist, und ich würde erwarten, dass, um dies zu erreichen, ich eine Aktion in der NSSplitViewController erstellen sollte, die die Auto-Layout-Einschränkungen mehr oder weniger in der Art ändert, wie sie es hier ausarbeiten: Wie zu reduzieren und zu erweitern Ansicht in Mac-Anwendung? .
Und dann verbinde diese Aktion irgendwie mit dem NSButton, der sich in der Toolbar befindet ... was zufällig im NSWindowController ist (weit oben und isoliert in der Hierarchie) ...
Ich habe bereits andere Fragen über NSToolbar und Storyboards beantwortet und mein Ziel nicht erreicht:
Apple erwähnte in der WWDC15 (wieder), dass sie Storyboards für osx und den Split-View-Controller mit View-Controllern erstellt haben, damit Sie Ihre Logik und Arbeit auf den speziellen View-Controller übertragen können Alles innerhalb meines Split-View-Controllers ausführen, da dies das Ziel ist, das geändert werden muss.
Weiß jemand, wie man dies vom View-Controller selbst erreichen kann? Ich war wirklich nicht in der Lage, eine Möglichkeit zu finden, mein ToolBarItem mit ihm zu verbinden.
OK, ich habe diese Frage vor einigen Tagen gestellt und bisher keine Antwort, also habe ich mit dem beantwortet, was ich kürzlich getan habe, um das Problem zu lösen.
Nachdem ich mein Xcode-Projekt erstellt habe, habe ich Folgendes gemacht:
Ein IBOutlet für jedes NSSsplitViewItem hinzugefügt. Zum Beispiel:
@IBOutlet schwach var mySplitViewItem: NSSsplitViewItem!
Erstellt eine Unterklasse WindowController für den NSWindowController
Eine Eigenschaft hinzugefügt, die den Inhalt des Window Controllers als MySplitViewController
erhältvar mySplitViewController: MySplitViewController { return self.window? .contentViewController as! MySplitViewController }
Jetzt kann ich vom Fenster-Controller in der Aktion, die ich erstellt habe, auf die Eigenschaft des Split-View-Controllers zugreifen:
mySplitViewController. mySplitViewItem.collapsed = Wahr
Ich habe einen Beispielcode erstellt, der das tut (aber mit einem View-Controller und dem Ändern des Textes für ein Label hier , einfach in Fall jemand will ein Arbeitsprojekt mit diesem Verhalten zu sehen. Und eine Blog-Post darüber auch :)
Also habe ich das gleiche Problem bearbeitet und keine Lösung gefunden, wie Sie es erlebt haben. Ich habe Ihren Beitrag gelesen und versuchte herauszufinden, wie ich Ihre Lösung implementieren würde, als mir der Gedanke kam, eine Benachrichtigung zu verwenden. In ungefähr 30 Sekunden hatte ich eine perfekt funktionierende Lösung:
Fügen Sie in Ihrem windowController eine IBAction hinzu, um eine Benachrichtigung wie folgt zu posten
%Vor% Schließen Sie diese Aktion an Ihr NSToolbarItem
an, und fügen Sie dann im viewController selbst als Beobachter für diese Benachrichtigung ein, wie zB
In Ihrem Fall wäre selector updateMyLabelText
Ich sehe hier wirklich keine Nachteile. Kein Bezug zu anderen Objekten, keine Abhängigkeiten. Funktioniert einwandfrei für mich
Eine Person schlägt vor, die Verbindung mit dem ersten reponder herzustellen und zu erwarten, dass alles zur Laufzeit verbunden wird (was ein bisschen zweideutig aussieht und nicht so, wie Apple es implementieren würde, denke ich ...).
Ich denke, diese Ersthelfer Methode ist eigentlich der richtige Weg.
Fügen Sie etwas ähnlich dem Folgenden hinzu, egal, welcher Controller sinnvoll ist.
%Vor%Dies wird auf magische Weise im Ersthelfer angezeigt:
Klicken Sie in Ihrem Storyboard mit der rechten Maustaste auf das orangefarbene Symbol "First Responder" über Ihrem Fenster-Controller, und Sie sollten doSomething
in der sehr langen Liste sehen. Sie müssen das nur mit Ihrer Symbolleistenschaltfläche verbinden.
In der folgenden Bildschirmaufnahme sehen Sie, dass meine Schaltfläche "Toggle Sidebar" mit der Aktion toggleSidebar
in meinem ersten Responder verbunden ist.
Ich musste diese Methode nicht einmal schreiben - sie wird von NSSplitViewController
:
Tags und Links macos swift xcode7 nstoolbar nssplitviewcontroller