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()
}
versuchen, mit einer AppDelegate Variable ... – Ananth
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