swift - 如何从 NSTableView 中选择列和行?

标签 swift macos nstableview nstablecolumn

我正在编写一个基于 NSTableView 的 View 。我尝试使用: 让 selectedRowNumber = tableViewMesos.selectedRow让 selectedColumnNumber = tableViewMesos.selectedColumn 识别我想保存到数组中的单元格 View 中的文本字段:

taulaDeConsumsMesos[selectedColumnNumber].filesConsum![selectedRowNumber] = sender.doubleValue

但是这里出现了一个问题,因为selectedColumnNumber的返回值是-1,即任意列的任意一行选中的非选中列的值。 但是 selectedRowNumber 正确返回行的索引。

因此,当完成单元格中文本字段的编辑时,程序会崩溃。因为 selectedColumnNumber 为 -1,超出了数组的限制。请参阅下面的代码以确定发生这种情况的确切位置。

你能帮帮我吗?我在这上面浪费了太多时间.. 我是 OSX 编程的新手,希望您能帮助我。

The app layout

这里是完整的代码:

class BalancGlobalViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate{

@IBOutlet weak var tableViewMesos: NSTableView!

let mesos = ColumnaDeConsumsMes() // contains an array of doubles called .filesConsum that represent the rows that I want to show
let consum = ColumnaDeConsumsMes()

var taulaDeConsumsMesos = [ColumnaDeConsumsMes]() // array of arrays that represent the columns with rows in it that will be the tableView data

func setUpMesos(){ // init table columns
    mesos.filesConsum = [1, 2, 3, 4, 5, 6, 7, 8 , 9, 10, 11, 12, nil]
    consum.filesConsum = [100, 100, 100, nil, nil, nil, nil, nil , nil, nil, nil, nil, nil]
    taulaDeConsumsMesos.append(mesos)
    taulaDeConsumsMesos.append(consum)
}

func setUpGradient(){
   ...not important here
}

override func viewDidLoad() {
    super.viewDidLoad()

    setUpMesos()

    tableViewMesos.setDelegate(self)
    tableViewMesos.setDataSource(self)

    setUpGradient()

}

override func viewDidLayout() {
    super.viewDidLayout()

    setUpGradient()
}

@IBAction func alEditarUnTextFieldDeConsum(sender: NSTextField) { // this is the IBAction of the TextField of the Consum Column (see the image)

    let selectedRowNumber = tableViewMesos.selectedRow
    let selectedColumnNumber = tableViewMesos.selectedColumn

    print("SelectedRowNumber! =  \(selectedRowNumber)")
    print("SelectedColumnNumber! =  \(selectedColumnNumber)")
    // the selectedColumnNumber return always -1 except when clicking the header of the column, then return 0 or 1 depending on the column. But it should return 0 even when the user edit a row of the index 0 column !!!

    let numero = tableViewMesos.numberOfColumns
    print("numero de columnes: \(numero)") // returns 2

    if selectedRowNumber != -1 {      //-1 is returned when no row is selected in the TableView
        taulaDeConsumsMesos[selectedColumnNumber].filesConsum![selectedRowNumber] = sender.doubleValue  //try to save here the value edited by the user on my array of arrays of doubles 
//here the program crashes! selectedColumnNumber = -1

        print("Sender! =  \(sender.doubleValue)") // the sender returns the information correctly
        //print("SelectedRowNumber! =  \(selectedRowNumber)") // this works too!

        reloadTaula()
    }

}

func tableViewSelectionDidChange(notification: NSNotification) {

    print("columna: \(tableViewMesos.selectedColumn)") 
    print("row: \(tableViewMesos.selectedRow)")
    print("tag: \(tableViewMesos.selectedTag())")
}
// the tableViewMesos.selectedColumn return always -1 except when clicking the header of the colum, then return 0 or 1 depending on the column. But i should return 0 even when I edit a row of the index 0 column !!!

func reloadTaula() {
    tableViewMesos.reloadData()
}


// MARK: - Datasource

func numberOfRowsInTableView(tableView: NSTableView) -> Int {
    if (tableView.identifier == "TaulaMesos") {
        return 13
    } 
}


// MARK: - Delegate

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {

    var valorCela: Double
    var cellIdentifier:String=""  

    if tableColumn == tableView.tableColumns[0] {
        if taulaDeConsumsMesos[0].filesConsum![row] == nil {
            return nil
        }else {
            valorCela = taulaDeConsumsMesos[0].filesConsum![row]!
            cellIdentifier = "MesCellID"
        }
    } else {
        if taulaDeConsumsMesos[1].filesConsum![row] == nil {
            return nil
        }else {
        valorCela = taulaDeConsumsMesos[1].filesConsum![row]!
        cellIdentifier = "ConsumCellID"
        }
    }
    if let cell = tableView.makeViewWithIdentifier(cellIdentifier, owner: nil ) as? NSTableCellView {
        cell.textField?.doubleValue = valorCela
        return cell
    }
    return nil

} 

最佳答案

表格 View 不支持选择单个单元格。两种样式的 TableView 都支持选择行。旧式基于 NSCell 的 TableView 支持选择列,但现代基于 View 的 TableView 不再支持选择列。但是 selectedRowselectedColumn 同时有效的情况永远不会发生。

来自10.7 AppKit release notes ,其中引入了基于 View 的 TableView :

Note that the View Based TableView does not support column selection.

要获取其文本字段发送操作的单元格的行和列,您应该使用 tableViewMesos.rowForView(sender)tableViewMesos.columnForView(sender)。请特别注意,不能保证发送操作方法的文本字段位于选定行中。所以,不要认为它是被选中的。它只是被用户操纵的那个。

关于swift - 如何从 NSTableView 中选择列和行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36095592/

相关文章:

用于 Mac 应用程序的 Facebook API

macos - vagrant up 卡在 nfs 挂载上

objective-c - NSScrollView 检测滚动位置

ios - 在 iOS8 Swift 中左对齐 AlertView 消息

ios - 将数组中的字符转换为整数

ios - 如何在 Swift 中使用字典构建 URL

ruby-on-rails - 回到 rails 的最快方法

objective-c - NSTableView 的选定列

nstableview - 绑定(bind)空占位符未在基于 View 的 NSTableView 中翻译

ios - 在 iOS 中同时插入 CoreData