2017-09-25 3 views
0

J'ai un problème en maintenant la sélection sur un NSTableView. J'utilise xCode 8.3.3 avec Swift 3.1 et construit pour macOS. Le tableauView basé sur les cellules est créé dans IB et a un NSButtonCell (une case à cocher) dans la première colonne du tableau. Cette colonne est liée à ModifiersController.arrangedObjects.enabled. La case à cocher fonctionne comme prévu ce qui signifie qu'elle peut être correctement cochée et décochée.Comment gérer la sélection TableView avec "Gère le contenu en tant que valeur composée"

Le problème est que lorsque je change l'état de la case en cliquant dessus, la ligne sélectionnée n'est plus sélectionnée et la première ligne est sélectionnée. Quelle que soit la ligne sélectionnée lorsque je change la case, c'est toujours la première ligne qui est sélectionnée. Ce que je m'attends à ce que ce que je m'attends à ce que la vérification/décochage de la boîte ne devrait pas affecter les lignes sélectionnées (mise en évidence).

enter image description here

Le ArrayController est nommé 'ModifiersController', et son Content Array est lié à une clé User Defaults Controller nommé MinimizeModifiers. Le MinimizeModifiers est un dictionnaire de valeurs avec un Value Transformer personnalisé. En raison de cela, j'ai activé la case Poignées de contenu en tant que composé Valeur

arraycontroller_bindings

Lorsque Poignées de contenu en tant que composé Valeur est hors (désactivé), la sélection dans la table est bien entretenu, mais le code sous-jacent (bindings à UserDefaults) ne fonctionne pas.

Lorsque Poignées de contenu en tant que composé Valeur est sur, les valeurs des éléments UI sont correctement liés à UserDefaults, cependant, ce est ce qui semble faire la table perdre la sélection actuelle. Donc, la question est: Comment est-ce que je peux maintenir la sélection de rangée de table quand manipule le contenu en tant que valeur composée est permis?

Addendum

Le tableView est lié à selectionIndexes et le contrôleur RAID est réglé sur preserve selection (j'ai aussi essayé avec preserve selection au large, et « Éviter la sélection vide » à la fois sur et en dehors - sans succès).

selectionIndexes_bind

arraycontroller_preserve

Et un lien vers un mini film montrant la question (si cela est autorisé) ... https://www.rgbworld.com/images/stackoverflow/selection.m4v

ADDITIF2

J'ai mis à jour le code pour Xcode 9 et Swift 4 et le problème persiste.Je crois que le problème peut avoir à faire avec mon utilisation de KVO et/ou l'utilisation de variables de support pour @objc dynamic var s

J'ai créé un dépôt github au cas où quelqu'un pourrait aider. Je vais ajouter une prime pour le dev qui m'aide à résoudre ce problème.

Githib repo

https://github.com/rgbworld/CompoundTransformer https://github.com/rgbworld/CompoundTransformer

+0

Avez-vous binds « Index de sélection » de l'affichage du tableau au contrôleur de tableau? Est-ce que 'Preserve Selection' est activé? – Willeke

+0

@Willeke Merci pour votre réponse. Oui et oui. J'ai mis à jour la question pour montrer les paramètres. – rgbworld

+0

Je ne peux pas reproduire ce problème, mais cliquer sur une case ne déclenche pas la sauvegarde des données. Quelque chose de bizarre se passe, quand j'ai essayé de découvrir comment la vue de table manipule la sélection, j'ai fini dans les mêmes méthodes qu'avec cette question [Comment faire NSArrayController préserveSelection fonctionne pour l'objet fait sur commande?] (Https: // stackoverflow. com/questions/46233759/comment-faire-nsarraycontroller-preservesselection-work-for-custom-object). – Willeke

Répondre

1

L'action de la case à cocher déclenche le contrôleur Paramètres par défaut pour enregistrer les données. La modification des valeurs par défaut de l'utilisateur déclenche une actualisation de la vue de la table. La ligne sélectionnée n'est pas restaurée. Solution: Mettre en œuvre isEqual(_:) dans ModifiersRuleTransformer.

Plus d'infos: How to make NSArrayController preservesSelection work for custom object?