получить значения ячеек NSTableView

Я новичок в кодировании OSX и кодировании приложения для Mac OS.

Как я могу получить доступ к тексту из строк, которые выбрал пользователь. В этом конкретном случае я разрешаю пользователям выбирать несколько строк для удаления из базы данных за один раз, и именно поэтому мне нужно получить текст, который я использую в качестве ключей в базе данных.

Работая на экране консоли, вот упрощенная версия того, что я пытаюсь сделать.

import Cocoa
import Foundation

extension MainViewController {

  func tableViewSelectionDidChange(_ notification: Notification) {

    let myColumn = 0                          // -- first column
    let myRow = tableViewFolders.selectedRow  // -- row int index clicked

    let myCell:String = "?"  // -- ?get row or cell as string and/or array

    print("myColumn: \(myColumn)")
    print("myRow: \(myRow)")
    print("myCell: \(myCell)")

  }

person BBExploration    schedule 20.05.2020    source источник
comment
Можно ли редактировать ключ?   -  person Willeke    schedule 21.05.2020
comment
Если я правильно вас понял, то нет. Я просто отображаю данные из оператора select в tableView. Когда я нажимаю на строки, я буду создавать массив, который позже будет передан в статус обновления базы данных (который удалит из базы данных эти записи), а затем перезагрузит данные из базы данных обратно в таблицу. По крайней мере, это то, что я планировал.   -  person BBExploration    schedule 21.05.2020
comment
Получите данные из модели данных или источника данных вместо табличного представления.   -  person Willeke    schedule 21.05.2020
comment
Я не понимаю. Изменения должны исходить от пользователя. Единственное место, где пользователь может видеть данные, — это таблица. Буду искать спасибо за попытку.   -  person BBExploration    schedule 21.05.2020
comment
Как таблица узнает, какие данные отображать?   -  person Willeke    schedule 21.05.2020
comment
Это зависит от того, как вы поддерживаете источник данных. Существует много способов: привязки какао, «половина» привязки какао (через objectValue(for), NSArrayController или NSTableViewDataSource.   -  person vadian    schedule 21.05.2020


Ответы (2)


Вот самая простая форма ответа, которую я смог выяснить. Это только один столбец, но я не вижу причин, по которым он не будет работать для таблиц с несколькими столбцами. Вам нужно будет получить доступ к каждому элементу столбца, используя индекс столбца после извлечения строки.

Короче говоря, у меня есть массив в памяти.
Этот массив загружен в tableView. Вот код, чтобы получить строки, которые пользователь выбрал, и что-то сделать с этими строками. Здесь я просто печатаю это на консоли.

import Cocoa
import Foundation

extension MainViewController {
    // -----------------------------------------------------------
    // -- Note: that myDataArray is loaded and in memory
    // -- that data is now showing inside of the tableView
    // -- now we want to do something with the rows the user
    // -- has selected.
    // -- also note: I'm only accessing a single column tableView
    // -----------------------------------------------------------

    func tableViewSelectionDidChange(_ notification: Notification) {

        // -----------------------------------------------------------
        // -- this is an array to store the selected rows data
        // -- in my case this is actually an instance array
        // -- in which I call .removeAll() on
        // -----------------------------------------------------------
        selectedRowsData[String] = []


        // -----------------------------------------------------------
        // -- get the set of indexes for the rows that are selected
        // -----------------------------------------------------------
        // -- myTableView.selectedRowIndexes 
        // --    this is an index set containing 
        // --    the indexes of the selected rows
        let selectedIndexSet = myTableView.selectedRowIndexes     


        // -----------------------------------------------------------
        // -- if your curious this is the quantity of rows selected
        // -- we will be looping through this set in a moment
        // -- selectedIndexSet returns '# indexes' literally
        // -- this index set contains something like ["2", "5", "9"]
        // -- etc...
        // -----------------------------------------------------------
        // print("selectedIndexSet: There are \(selectedIndexSet)")


        // -----------------------------------------------------------
        // -- loop through the index set and extract 
        // -- from the original data array "myDataArray"
        // -- the value that each row index points to
        // -----------------------------------------------------------
        for index in selectedIndexSet {  
            if index > -1 {
                // -----------------------------------------------------------
                // -- append the actual data to selectedRowsData
                // -- this will provide quoted string comma separated data 
                // -- ["dataA", "dataB", "more data here"]
                // -----------------------------------------------------------
                selectedRowsData.append(myDataArray.self[index])
            }
        }
        print("selectedRowsData \n \(selectedRowsData)")
    }
}
person BBExploration    schedule 21.05.2020

Для получения данных одной строки вы можете использовать:

func tableViewSelectionDidChange(notification: NSNotification) {
    let table = notification.object as! NSTableView
    print(table.selectedRow);

    var row = table.selectedRow
    var column = table.tableColumnWithIdentifier("ID")
    var cell: AnyObject? = column?.dataCellForRow(row)
    print("Cell Value - \(cell!.stringValue)")
}
person grow4gaurav    schedule 20.05.2020
comment
Кажется, я не могу опубликовать отформатированное заявление в разделе комментариев. Поэтому я просто скажу, что даже работая над ошибками, я не мог заставить работать приведенный выше код. Вывод равен нулю. Я новичок, поэтому, вероятно, просто не читаю и не конвертирую его правильно. Я использую Каталину, Xcode 11.1. - person BBExploration; 21.05.2020
comment
dataCellForRow устарел и предназначен для использования с представлениями таблиц на основе ячеек. - person Willeke; 21.05.2020