2017-09-21 3 views
0

J'ai un TableView, et un TableViewControllerCertaines vues tableView ne sont pas rechargent, comme mon délégué TableView ne reçoit pas tableView: viewFor: ligne: pour chaque ligne

Le TableView'sdelegate et datasource sont mis à la TableViewController

Alors, quand la table va tirer, il demande au délégué des points de vue, et exécution de ce code:

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

    let result = tableView.make(withIdentifier: "flagView", owner: self) as? TableCellView 

    case "technicalFlag", "supplyFlag": 
     let button = result?.control as? NSButton { 
      button.state = value.boolValue ? NSOnState : NSOffState 
     } 
    } 

qui met à jour les boutons correctement:
enter image description here

Remarquez comment il y a 5 drapeaux pour risque technique

Cependant, quand je vais trier par des risques d'approvisionnement, il appelle tableView.reloadData()

Mais, pas toutes les vues se rechargées?

En conséquence, certains des drapeaux noirs restent, même quand ils ne devraient pas être (notez 8+ drapeaux noirs dans le risque technique, maintenant)

enter image description here

Il est apparemment aléatoire des drapeaux sont noirs (quand je regarde les données via une autre vue via le menu contextuel, je peux dire que les drapeaux devraient vraiment être noir)

donc ostensiblement, il ressemble à un problème de redécoupage. J'ai tout essayé, mais je ne peux pas obtenir ces vues à redessiner. Est-ce que je manque quelque chose?

J'ai confirmé que tableView:viewFor:row: est tout simplement pas appelé autant de fois que je pense qu'il devrait

Je suppose que, pour résumer les choses, je pensais que l'appel reloadData() mettra à jour toutes les vues à chaque ligne x colonne? Comment le runtime décide-t-il quelles vues obtiennent l'appel de mise à jour?

+0

Comment avez-vous vérifier si 'tableView: viewFor: ligne:' est appelé pour chaque cellule visible? Quelles cellules sont ignorées? Quels drapeaux ont tort? La même chose se produit-elle avec la colonne Risque d'approvisionnement? Je – Willeke

+0

imprimé déclarations du journal au début de la méthode, la même chose se produit avec l'autre colonne, et je ne suis pas sûr que les drapeaux sont mauvais, il semble un peu au hasard. Je pourrais réduire la quantité de données et essayer d'avoir une meilleure idée de ceux qui sont faux si –

Répondre

0

Ah résolu le problème, je l'avais modifié le code original parce que je ne pensais pas qu'il était pertinent de montrer:

case "technicalRiskFlag", "supplyRisk": 
     if let value = node.value(forKeyPath: identifier) as? NSNumber, 
     let button = result?.control as? NSButton { 
      button.state = value.boolValue ? NSOnState : NSOffState 
     } 

Mais se avère que value pourrait être nil, qui a fini par ne pas redessiner le drapeau. Je ne sais pas pourquoi la méthode délégué n'a pas s'appelait encore, mais je changé le code à ceci:

 if let button = result?.control as? NSButton { 
      if let value = node.value(forKeyPath: identifier) as? NSNumber { 
       button.state = value.boolValue ? NSOnState : NSOffState 
      } else { 
       button.state = NSOffState 
      } 
     } 

et il fonctionne parfaitement maintenant