2017-02-25 2 views
0

Arbeiten an einem Einstellungsfenster. Ich habe eine NSTabView; Registerkarten werden dynamisch von einer XIB erstellt. Sie sind alle sehr ähnlich, aber nicht identisch. Also, ich brauche einige Werte zu ändern (und einige Steuerelemente zu erscheinen oder zu verschwinden), je nachdem welche Registerkarte ausgewählt ist.Swift/Cocoa: So binden Sie einen Wert an die aktuell ausgewählte Registerkarte

Normalerweise würde man denken, dass es möglich wäre, an NSTabView.selectedTabViewItem zu binden; aber das funktioniert nicht. Warum? Der Wert wird nie aktualisiert.

Dann wurde ich kreativer und dachte über eine berechnete Eigenschaft nach, die den passenden Wert für die zu beobachtende Bindung zurückgibt. Immer noch keine Würfel. Die Bindungen werden beim Starten der App ausgewertet und nie aktualisiert.

Dann entschied ich mich, chaotisch zu gehen und machte einen Delegaten, um die didSelect-Methode der tabView zu implementieren, wobei die aktuell ausgewählte Registerkarte in eine gespeicherte Eigenschaft geschrieben wird, die die Bindung beobachten kann.

Dieser letzte Ansatz funktioniert, aber es fühlt sich sehr klobig und schmutzig an. Kennt jemand einen besseren Weg?

Edit: Ich versuche, den NSTabViewController zu implementieren, aber ich kann es einfach nicht funktionieren!

Wenn ich den NSTabViewController manuell an das NSTabView-Objekt binden, das ich in IB erstellt habe, scheint alles ordnungsgemäß initialisiert zu sein, aber die Registerkarten werden nie angezeigt. Und, wenn ich versuche, alles in den Controller zu initialisieren, und weisen Sie dann die NSTabView über die NSTabViewController.tabView Eigenschaft, erhalte ich

A TabView managed by a TabViewController cannot have its delegate modified 

Welche ungerade ist, weil ich versuche, es zu tun, um die Art und Weise der Dokumenta tion tun spezifiziert. In der Tat, auch wenn ich versuche, TabViewController.tabView = NSTabView() zu tun, bekomme ich den gleichen Fehler. Ist das ein Fehler?

Hier ist der gesamte relevante Teil meines Codes,

@IBOutlet weak var theTabView: NSTabView? 
@IBOutlet weak var tabViewDelegate: NSTabViewController? 
    override func assignMainView() { 
    ControllersRef.sharedInstance.tabViewController = self.tabViewController 
    ControllersRef.sharedInstance.theTabView = self.theTabView 
    ControllersRef.sharedInstance.thePrefPane = self 
    let tabs = ["Internet", "URL Schemes", "Uniform Type Identifiers", "Applications"] 

    if let tabViewDelegate = self.tabViewDelegate { 
     for tab in tabs { 
      let newTab = NSTabViewItem(viewController: NSViewController.init()) // I tried doing it the other way around also, i.e. via addChildViewController() and tabItem(for:), but the result was the same. 

      newTab.label = tab 
      let newTabViewItemView = DRYView.init() 
      newTabViewItemView.nibName = "SWDAPrefpaneTabTemplate" 

      tabViewDelegate.addChildViewController(newTab.viewController!) 
      newTab.viewController!.view = newTabViewItemView 

     } 
     let views = tabViewDelegate.childViewControllers 
     tabViewDelegate.tabView = ControllersRef.sharedInstance.theTabView 

    } 
    super.assignMainView() 
} 
+0

versuchen, mit einer AppDelegate Variable ... – Ananth

+0

Don‘ t Bindung an eine Ansicht, Bindung an einen Controller (oder Dokument- oder Anwendungsdelegaten). Warum möchten Sie Objekte auf unsichtbaren Tabs verstecken und anzeigen? Kannst du die Ansichten nicht einmal verstecken? – Willeke

Antwort

1

Sie sollten in der Lage sein, eine NSTabViewController und seine selectedTabViewItemIndex Eigenschaft zu verwenden, die speziell dokumentiert Bindings-konform zu sein.

Bei Bedarf können Sie eine berechnete Eigenschaft erstellen, die auf selectedTabViewItemIndex basiert, um sie einem geeigneten Modellobjekt für das ausgewählte Objekt zuzuordnen. Wenn Sie das tun, stellen Sie sicher, dass Sie die Klassenmethode keyPathsForValuesAffecting<Key> implementieren, um ["selectedTabViewItemIndex"] zurückzugeben, sodass KVO weiß, dass Ihre berechnete Eigenschaft als geändert betrachtet wird, wenn sich selectedTabViewItemIndex ändert.

(Dies ist wahrscheinlich nicht ausreicht, um die berechnete Eigenschaft zu machen Arbeit, die Sie bereits versucht, weil NSTabView ‚s selectedTabViewItem selbst nicht als KVO-konform dokumentiert.)

+0

Wird dies versuchen. Eine Frage, obwohl ... Ich bin nicht wirklich sicher, wie NSTabViewController zu implementieren, und konnte nicht genügend Dokumentation finden, um mir wirklich zu helfen. Selbst wenn ich eine leere NSTabViewController-Unterklasse implementieren, bricht meine NSTabView, Tabs nicht auswählbar sein (und ich bekomme einen Absturz, wenn ich versuche, sie zu ändern) ... weshalb meine aktuelle Implementierung stattdessen eine NSViewController-Unterklasse verwendet, die ebenfalls NSTabViewDelegate entspricht. –

+0

Wie erstellen Sie Ihre Tab-Ansicht, programmatisch oder über IB? –

+0

Erstellen der Registerkartenansicht über IB und dynamisches Hinzufügen von Registerkarten über mainViewDidLoad() –

Verwandte Themen