2016-03-18 87 views
0

我在写一个基于NSTableView的视图。我尝试使用: let selectedRowNumber = tableViewMesos.selectedRowlet selectedColumnNumber = tableViewMesos.selectedColumn识别文本框是在我想保存到我的数组单元查看:如何从NSTableView中选择列和行?

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

但问题发生在这里,因为selectedColumnNumber返回值是-1,它是任何列中所选行的未选列的值。 但selectedRowNumber正确返回该行的索引。

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

你能帮我吗?我在这方面损失了太多时间.. 我是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 

} 

}

回答

3

表格视图不支持选择的单个细胞。两种样式的表格视图都支持选择行。基于旧式NSCell的表格视图支持选择列,但现代基于视图的表格视图不再支持选择列。但是,selectedRowselectedColumn在同一时间内都不会有效。

10.7 AppKit release notes,其中基于视图的表视图进行了介绍:

注意,查看基于TableView中不支持列选择。

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

+0

谢谢你的回答肯! –

相关问题