Wert aus einer Zelle eines NSTableView auslesen?

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

  • Wert aus einer Zelle eines NSTableView auslesen?

    Guten Tag zusammen,

    ich möchte aus einer NSTableView von einer selektierten Zeile den Wert einer Zelle auslesen.
    Leider habe ich keine Ahnung wie dies umzusetzen ist. Eine Recherche im Internet blieb erfolglos.
    Vielleicht kann mir jemand auf die Sprünge helfen.

    Beste Grüße

    Patrick
  • grobekelle schrieb:

    ich möchte aus einer NSTableView von einer selektierten Zeile den Wert einer Zelle auslesen.
    Leider habe ich keine Ahnung wie dies umzusetzen ist. Eine Recherche im Internet blieb erfolglos.
    Echt jetzt? Was / wie hast Du denn recherchiert?

    In der Apple Dokumentation wirst Du auf das NSTableViewDelegate-Protokoll hingewiesen, das so spannende Methoden wie tableViewSelectionDidChange: definiert. Dort könnte man z. B. ermitteln, welche Zeile ausgewählt wurde und entsprechende Objekte aus der DataSource nutzen:

    Quellcode

    1. -(void)tableViewSelectionDidChange:(NSNotification *)notification{
    2. NSLog(@"%d",[[notification object] selectedRow]);
    3. }
    Das solltest Du ohne weiteres unter der ersten Handvoll Google-Treffer für "nstableview get selection" finden können...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • ein NSTableView hat die Methoden -selectedRow und -selectedColumn bzw. Varianten die einen NSIndexSet liefern wenn der Anwender mehrere selektiert hat.
    Dann kann man den -delegate bestimmen und dessen -tableView:objectValueForTableColumn:row: aufrufen. Falls man nicht wie Thallius sagt, direkt auf das Datenmodell zugreifen will.
    Der Mac macht auch nichts anderes, bevor er die selektierte Cell auf den Bildschirm malt.
  • Guten Abend zusammen,

    zunächst einmal vielen Dank für die zahlreichen Antworten.
    Erreichen möchte ich, das ich durch Selektieren einer Zeile und durch einen "Klick" auf einen Button, diese Zeile aus der SQLite DB lösche.
    Mein Gedankengang war folgender, aus der selektierten Zeile wollte ich den PrimarKey (ID) auslesen und dann via SQL Statement diese Zeile aus der DB löschen.
    Vielleicht gibt es eine schöner Lösung?

    Die Daten aus der DB bereite ich wie folgt auf.

    Quellcode

    1. func readTable(){
    2. do {
    3. tableViewData.removeAll()
    4. var i = 0
    5. for user in try db.prepare(table.order(size.desc)) {
    6. i = i + 1
    7. tableViewData.append(["number":"\(i)","name":"\(user[name])","date":"\(user[date])","size":"\(user[size])","id":"\(user[id])"])
    8. }
    9. self.tableView.reloadData()
    10. } catch {
    11. }
    12. }
    Alles anzeigen
    In die Tableview gelangen Daten dann wie folgt.


    Quellcode

    1. override func viewDidLoad() {
    2. super.viewDidLoad()
    3. connectToDataBase()
    4. createTable()
    5. readTable()
    6. self.tableView.delegate = self as NSTableViewDelegate
    7. self.tableView.dataSource = self
    8. self.tableView.reloadData()
    9. }
    10. extension ViewController:NSTableViewDataSource, NSTableViewDelegate{
    11. func numberOfRows(in tableView: NSTableView) -> Int {
    12. return tableViewData.count
    13. }
    14. func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?{
    15. var result:NSTableCellView
    16. result = tableView.makeView(withIdentifier: (tableColumn?.identifier)!, owner: self) as! NSTableCellView
    17. result.textField?.stringValue = tableViewData[row][(tableColumn?.identifier.rawValue)!]!
    18. return result
    19. }
    20. }
    Alles anzeigen
  • Ich habe es jetzt wie folgt gelöst. Ob das jetzt die sauberste Lösung ist wage ich zu bezweifeln, es funktioniert jedoch.

    Quellcode

    1. func deleteSelectedRow(){
    2. do{
    3. let rowSelected = tableView.selectedRow
    4. if(rowSelected < 0){
    5. statusMessage(message: "Es wurde kein Eintrag ausgewählt.", alert: true)
    6. } else {
    7. tableViewData.removeAll()
    8. let query = table.order(size.desc) // ORDER BY "size" DESC, "name"
    9. .limit(1,offset: rowSelected) // LIMIT 1 OFFSET 1
    10. try db.run(query.delete())
    11. readTable()
    12. self.tableView.reloadData()
    13. statusMessage(message: "Der Eintrag wurde entfernt.", alert: false)
    14. }
    15. } catch {
    16. statusMessage(message: "Fehler beim entfernen des Eintrages.", alert: true)
    17. }
    18. }
    Alles anzeigen
  • Ich verstehe nicht, warum Du die Datensätze nach der Löschung komplett neu lädst, statt einfach nur das entsprechende Element aus dem Array zu entfernen ... natürlich nur bei einer erfolgreichen Löschung.

    Je nach Grösse der Tabelle könnte das auf die Performance drücken.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Ich finde diese „Ich habe das getan, was du wolltest“-Alerts immer furchtbar. Der User sieht ohnehin, dass der Datensatz verschwindet.

    Wozu If(rowSelected...? Der Löschen-Button sollte nicht aktiv sein, wenn kein DS ausgewählt ist.

    Soviel zum UI-Kram.

    Schräg, dieses SQL bei einem Mac/iOSxProjekt (für mich). Hast Du Dir schon mal Core Data angesehen?
  • MyMattes schrieb:

    Ich verstehe nicht, warum Du die Datensätze nach der Löschung komplett neu lädst, statt einfach nur das entsprechende Element aus dem Array zu entfernen ... natürlich nur bei einer erfolgreichen Löschung.

    Je nach Grösse der Tabelle könnte das auf die Performance drücken.

    Mattes
    Hallo Mattes, das ist ein guter Hinweis. Ich werde morgen mal versuchen deinen Vorschlag umzusetzen.

    norbi schrieb:

    Ich finde diese „Ich habe das getan, was du wolltest“-Alerts immer furchtbar. Der User sieht ohnehin, dass der Datensatz verschwindet.

    Wozu If(rowSelected...? Der Löschen-Button sollte nicht aktiv sein, wenn kein DS ausgewählt ist.

    Soviel zum UI-Kram.

    Schräg, dieses SQL bei einem Mac/iOSxProjekt (für mich). Hast Du Dir schon mal Core Data angesehen?
    Hallo Norbi, ich gebe dir Recht, die Alerts sind unnötig. Den Ansatz mit dem Button finde ich interessant. Kannst du mir dazu einen kleinen Anstoss geben, damit ich weiß in welche Richtung ich recherchieren muss. Ich bin bei der "Welche DB nutze ich in meiner ersten MacOS Anwendung?"-Recherche auf SQLite gestoßen, mit der ich schon erste Erfahrungen unter C# .net gemacht habe. Ich werde mit Core Data mal ansehen.
  • Button: via Binding. Das setzt man im Interface über einen Datenmodell „Keypath“
    Syntax ist bei mir eine Weile her... schau mal hier beim Beitrag, der mit „Here's a solution using bindings.“ beginnt:
    stackoverflow.com/questions/37…textfield-is-empty-or-not
    Das Nette: kein Code nötig, wenn Du Core Data benutzt, weil dies von sich aus jede Veränderung im Modell bemerkt.

    Möglichst wenig Code brauchst Du also, wenn Du Core Data benutzt und Bindings. Dein Datenmodell / Deine Business-Logik ist im Datenmodell, drauf das UI. Verbindung zwischen beiden via Bindings.
  • norbi schrieb:

    Button: via Binding. Das setzt man im Interface über einen Datenmodell „Keypath“
    Syntax ist bei mir eine Weile her... schau mal hier beim Beitrag, der mit „Here's a solution using bindings.“ beginnt:
    stackoverflow.com/questions/37…textfield-is-empty-or-not
    Das Nette: kein Code nötig, wenn Du Core Data benutzt, weil dies von sich aus jede Veränderung im Modell bemerkt.

    Möglichst wenig Code brauchst Du also, wenn Du Core Data benutzt und Bindings. Dein Datenmodell / Deine Business-Logik ist im Datenmodell, drauf das UI. Verbindung zwischen beiden via Bindings.

    Ich hätte mir wohl einiges an Arbeit gespart mit Core Data. Sieht interessant aus. Ich werde die Anwendung noch einmal dahingehend abändern und dann auch versuchen das die Button Thematik mit dem Binding umzusetzen.

    Vielen Dank euch für die hilfreichen Tipps.