2015-10-26 1 views
0

J'essaye d'obtenir par programme un identificateur column.identifier pour la cellule en cours d'édition. Je suis en train de faire en vous inscrivant mon NSViewController pour NSControlTextDidBeginEditingNotification et quand je reçois la notification je suivre les données sur l'emplacement de la souris:NSTableView détecte NSTableColumn pour la cellule sélectionnée au début de l'édition de la cellule

var selectedRow = -1 
var selectedColumn: NSTableColumn? 

func editingStarted(notification: NSNotification) { 
    selectedRow = participantTable.rowAtPoint(participantTable.convertPoint(NSEvent.mouseLocation(), fromView: nil)) 

    let columnIndex = participantTable.columnAtPoint(participantTable.convertPoint(NSEvent.mouseLocation(), fromView: nil)) 
    selectedColumn = participantTable.tableColumns[columnIndex] 

} 

Le problème que j'ai est que l'emplacement de la souris me donne les données erronées, est Il existe un moyen d'obtenir l'emplacement de la souris en fonction de l'emplacement de la table, ou pourrait-il y avoir un meilleur moyen d'obtenir cette information?

PS. Mon NSViewController est NSTableViewDelegate et NSTableViewDataSource, mon NSTableView est View Based et se connecte à un ArrayController qui se met à jour correctement, et je pourrais aller à mon objet Model et détecter les changements dans les propriétés willSet ou didSet, mais je dois détecter quand un changement est étant fait par l'utilisateur et c'est pourquoi j'ai besoin de détecter le changement avant qu'il ne se produise sur le NSTableView.

Répondre

1

Cette question a 1 an mais j'ai eu le même problème aujourd'hui et je l'ai corrigé. Les gens m'ont beaucoup aidé ici, donc je contribuerai moi-même si quelqu'un a trouvé ce fil.
Voici la solution:

1/Ajouter le NSTextFieldDelegate à votre ViewController:

class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource, NSTextFieldDelegate { 

2/Lorsqu'un utilisateur souhaite modifier une cellule, il avait d'abord sélectionner la ligne. Nous allons donc détecter que cette fonction déléguée:

func tableViewSelectionDidChange(_ notification: Notification) { 
     let selectedRow = self.tableView.selectedRow 

     // If the user selected a row. (When no row is selected, the index is -1) 
     if (selectedRow > -1) { 
     let myCell = self.tableView.view(atColumn: self.tableView.column(withIdentifier: "myColumnIdentifier"), row: selectedRow, makeIfNecessary: true) as! NSTableCellView 

     // Get the textField to detect and add it the delegate 
     let textField = myCell.textField 
     textField?.delegate = self 
    } 
} 

3/Lorsque l'utilisateur éditera la cellule, nous pouvons obtenir l'événement (et les données) avec 3 fonctions différentes. Choisissez ceux dont vous avez besoin:

override func controlTextDidBeginEditing(_ obj: Notification) { 
    // Get the data when the user begin to write 
} 

override func controlTextDidEndEditing(_ obj: Notification) { 
    // Get the data when the user stopped to write 
} 

override func controlTextDidChange(_ obj: Notification) { 
    // Get the data every time the user writes a character 
}