NSToolbar in Xcode 7 mit Storyboards (NSWindowController - NSSsplitViewController)

8

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:

  • Das YouTube-Video: Cocoa Programming L17 - NSToolbar das ist das nächste, das ich gefunden habe, um das Problem zu lösen, aber Seine Methode funktioniert nicht für Storyboards, sondern erstellt nur eine eigene XIB-Datei.
  • In dieser Frage: Wie NSToolBar in Xcode 6 zu verwenden und Storyboard? 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 die Art, wie Apple es implementieren würde, denke ich ...). Eine zweite Person schlug vor, eine View-Controller-Variable im NSWindowController zu erstellen und ihre Eigenschaften von dort aus zu manipulieren ... aber auch hier wieder etwas zwielichtig.
  • Einer der letzten Kommentare, die ich in dieser Frage gesehen habe, scheint der beste Weg zu sein, das Problem anzugehen (aber immer noch nicht so gut wie ich denke) ist, einen NSObjectController zum Dock hinzuzufügen Szene und wenn die Szene geladen wird, setze die Werte der Objekte auf den Controller der anderen Secene. Ist das wirklich der beste Weg, um voranzukommen? Wenn ja, wie könnte ich das erreichen?

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.

    
gbdavid 24.06.2015, 10:00
quelle

3 Antworten

3

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:

  • Eine Unterklasse MySplitViewController für den NSSsplitViewController
  • erstellt
  • Ein IBOutlet für jedes NSSsplitViewItem hinzugefügt. Zum Beispiel:

    @IBOutlet schwach var mySplitViewItem: NSSsplitViewItem!

  • Erstellt eine Unterklasse WindowController für den NSWindowController

  • Eine IBAction in der WindowController-Klasse hinzugefügt, die mit dem NSToolbarItem (meine Schaltfläche)
  • verknüpft ist
  • Eine Eigenschaft hinzugefügt, die den Inhalt des Window Controllers als MySplitViewController

    erhält

    var 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 :)

    
gbdavid 11.07.2015, 08:12
quelle
0

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

%Vor%

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

    
Dean Davids 07.02.2016 00:49
quelle
0
  

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.

Als Beispiel:

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 :

bereitgestellt %Vor%     
jeff-h 11.05.2017 07:01
quelle