Xcode OSX Swift Storyboard NSArrayController NSTableView

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Xcode OSX Swift Storyboard NSArrayController NSTableView

    Hallo,

    es ist das erste Mal das ich einen NSArrayController mit einem NSTableView im Storyboard verbunden bzw. im Einsatz habe. Soweit funktioniert auch alles einwandfrei, doch nun wollte ich den selektierten Wert des TableView speichern bzw. ausgeben. Wie funktioniert dies? Mit dem u.g. Code erhalte ich den Index, so weit so gut, doch wie erhalte ich den Wer des selektierten TableView-Feldes?

    Quellcode

    1. @IBOutlet var sideAC: NSArrayController!
    2. @IBOutlet weak var outletTableView: NSTableView!
    3. ...
    4. @IBAction func actionTableView(_ sender: Any)
    5. {
    6. let index: Int = outletTableView.selectedRow
    7. if index > -1
    8. {
    9. print("selected Index: ", index) // Ausgabe liefert den selektierten Index korrekt
    10. print("selected Value: ", sideAC[index]) // funktioniert leider so nicht!
    11. }
    12. }
    Alles anzeigen
  • Habe Deinen Hinweis mal wie folgt umgesetzt:

    Quellcode

    1. print("selected Value: ", sideAC.selectedObjects)

    Nun erhalte ich folgende Ausgabe: selected Value: Optional([<Beispiel.tabViewList: 0x600000cb5ce0>])

    Den zugeordneten Wert wollte ich nun mit folgender Zeile ermitteln und ausgeben:

    Quellcode

    1. print("selected Value: ", (sideAC.selectedObjects.unsafelyUnwrapped[0] as AnyObject).sValue
    Die Fehlermeldung lautet nun das keine Key-Value Bindung existiert. Aber der Name "sValue" ist im Array Index 0 vorhanden. Was beachte ich hier nicht? :/

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von OSXDev () aus folgendem Grund: Korrektur/Nachtrag

  • MCDan schrieb:

    Die Objekte in dem Array, welches von selectedObjects zurückgeliefert wird, sind von der Klasse, mit welcher Du den NSArrayController gefüllt hast.
    Also irgendwie ist gerade der Wurm drin. Im Grunde müsste diese Vorgehensweise sich doch nur durch den eingeschobenen NSArrayController von einer Code gesteuerten Zuweisung eines NSArrays an ein NSTableView unterscheiden oder lieg ich hier ebenfalls schon daneben?

    Wenn diese Annahme richtig ist, dann sollten doch in beiden Fällen, die Objekte die selben Variablennamen aufweisen?

    Was mich auch etwas irritiert ist, dass nur ein Objekt im Array vorhanden ist und es ist völlig wirkungslos welchen Eintrag im TableView selektiert habe. Das kann doch nicht richtig sein, oder?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev ()

  • MCDan schrieb:

    Wenn die Selektion im NSArrayController nicht mit der Selektion im NSTableView übereinstimmt, dann fehlt Dir noch das passende Binding.
    Dieses Beispiel von Eric Rosko (youtube.com/watch?v=8LTz1hprMNE) habe ich mal geladen und versucht dort den selektierten Eintrag via print() auf der Konsole auszugeben (s. Code). Dem Array habe ich außerdem zwei weitere Einträge hinzugefügt. Diese erscheinen im NSTableView und können auch selektiert werden.

    Quellcode

    1. @IBOutlet weak var outletTableView: NSTableView!
    2. ...
    3. override func viewDidLoad()
    4. {
    5. super.viewDidLoad()
    6. let person = Person(name: "Bob")
    7. let person1 = Person(name: "Jane")
    8. let person2 = Person(name: "Kate")
    9. self.personAC.addObject(person)
    10. self.personAC.addObject(person1)
    11. self.personAC.addObject(person2)
    12. }
    13. ...
    14. @IBAction func actionTableView(_ sender: Any)
    15. {
    16. let index: Int = outletTableView.selectedRow
    17. if index > -1
    18. {
    19. let selPerson = (personAC.selectedObjects[index] as AnyObject)
    20. print("selected Dataset: ", selPerson)
    21. }
    22. }
    Alles anzeigen
    Auch hier wird die Variable Index richtig ermittelt, doch wie bei mir kann ich ebenfalls nicht den selektierten Eintrag ausgeben.

    An welcher Stelle muss da noch ein Binding hinzugefügen werden?

    Nachtrag:
    Wenn ich ein separates NSArray anlege und dieses ebenfalls mit den Werten (Bob, Jane, Kate) befülle, dann kann ich logischerweise über den ermittelten Index den Wert aus diesem NSArray auslesen. Dies löst zwar mein Problem, ganz nach dem Motto doppelt gemoppelt hält besser - aber dass muss doch auch ohne ein weiteres Array funktionieren, oder nicht?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev () aus folgendem Grund: Nachtrag

  • In dem Beispiel Projekt fehlt das Bindung für Selection Indexes bei dem TableView. Somit wird nur der Inhalt, aber nicht die Selektion von dem NSArrayController im TableView verwendet.

    Ich habe das Beispiel Projekt mal "gefixt" und die Methode pressedPrintToConsoleButton() so abgeändert, dass der selektierte Eintrag vom NSArrayController ausgegeben wird.
    Dateien
  • MCDan schrieb:

    In dem Beispiel Projekt fehlt das Bindung für Selection Indexes bei dem TableView. Somit wird nur der Inhalt, aber nicht die Selektion von dem NSArrayController im TableView verwendet.
    ...
    @MCDan: Vielen Dank für Deine tatkräftige Unterstützung. :thumbsup:

    Deinen Hinweis bzgl. der Bindung von Selection Indexes habe ich gleich mal bei mir nachgepflegt und siehe da, es funktioniert einwandfrei. Da eine Bindung logischerweise bereits zwischen NSArrayController und NSTableView etabliert wurde und somit alle Einträge im TableView angezeigt wurden, bin ich davon ausgegangen, dass der Wert des selektierten Items - in dieser Konstellation - aus der TableView entnommen wird. :/ Tja, mal lernt halt nicht aus. ;(
  • Eine Frage habe ich noch bzgl. der Handhabung der NSTableView. Wie kann ich den Focus (blauer Balken) deaktivieren - beim Aufruf soll keine Vorauswahl getroffen werden / selektiert sein?

    Nachtrag:
    Falls es nicht möglich sein sollte die Vorauswahl zu deaktivieren, wie kann ich dann dafür sorgen, dass der erste Eintrag selektiert ist. Kann die Balkenfarbe Blau durch eine andere Farbe ersetzt werden?


    Danke mal vorab.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev () aus folgendem Grund: Nachtrag

  • NSArrayController hat das Property avoidsEmptySelection, welches per Default true ist und dafür sogt, dass es immer eine Selektion gibt. Auf false sollte der NSArrayController dann auch keine Selektion erlauben.

    Über setSelectedObjects(_:) kannst Du das/die gewünschte(n) Objekt(e) selektieren.

    Alternativ kann man die Selektion auch per setSelectionIndex(_:) oder setSelectionIndexes(_:) setzen.
  • MCDan schrieb:

    NSArrayController hat das Property avoidsEmptySelection, welches per Default true ist und dafür sogt, dass es immer eine Selektion gibt. Auf false sollte der NSArrayController dann auch keine Selektion erlauben.

    Über setSelectedObjects(_:) kannst Du das/die gewünschte(n) Objekt(e) selektieren.

    Alternativ kann man die Selektion auch per setSelectionIndex(_:) oder setSelectionIndexes(_:) setzen.
    @MCDan: Funktioniert einwandfrei. :thumbup:

    Nun noch eine letzte Frage zu diesem Themenkomplex. Wie kann ich die Farbe des selektierten Eintrages von blau auf z.B. rot umstellen?

    Nachtrag:
    Den blauen Balken, welcher den selektierten Eintrag kennzeichnet kann ich mit folgendem Code deaktivieren. Bin aber noch nicht im Bilde, wie sich die Farbe ändern lässt.

    Quellcode

    1. outletTableView.selectionHighlightStyle = .none

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von OSXDev () aus folgendem Grund: Nachtrag

  • OSXDev schrieb:

    Nun noch eine letzte Frage zu diesem Themenkomplex. Wie kann ich die Farbe des selektierten Eintrages von blau auf z.B. rot umstellen?
    In den Systemeinstellungen -> Allgemein -> Auswahlfarbe

    Mein Rat: unter macOS sollte man am Erscheinungsbild nicht ohne triftigen Grund herum basteln. Konsistenz war mal eine der Stärken von macOS. Leider wird darauf von Entwicklerseite immer weniger geachtet. Auch von Apple nicht.