NSTableView: sortir du mode édition de cellule
Rocou
Membre
Bonjour,
Dans une NSTableView, on peut éditer une cellule en double-cliquant dessus. En cliquant sur une autre cellule, on quitte l'édition.
Je voudrais réaliser cela par programmation mais je n'y arrive pas.
Dans une NSTableView, on peut éditer une cellule en double-cliquant dessus. En cliquant sur une autre cellule, on quitte l'édition.
Je voudrais réaliser cela par programmation mais je n'y arrive pas.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
En cherchant tu trouvera
Edit : La preuve : http://www.pommedev.com/forum/index.php?topic=1147.msg12471#msg12471
:P
Oui, je te remercie. J'avais fini par trouver ce fil mais je n'arrive pas a implémenter les exemples.
Comme pour toi, ça ne passe jamais dans la notification.
A défaut, est-il possible de rester en édition sur la même ligne en empêchant l'utilisateur de changer de ligne?
Mon but et de récupérer les valeurs des cellules d'une ligne venant d'être éditée en cliquant sur un bouton de mon interface.
J'ai trouvé le moyen de sortir de l'édition et de sélectionner la ligne venant d'être éditer en cliquant sur mon bouton mais si l'utilisateur clique (ou double-clique) sur une autre ligne, c'est foutu.
Cela t'évitera de jouer avec le sélection et une tentative de lecture des données affiché ! NSTableView n'est pas là pour stocker les données mais uniquement pour les afficher. C'est pour cela qu'après une modification le datasource est averti de la modification.
Car une fois averti, il modifie les données en mémoire et demande à la table view de recharger les données (reloadData) !
EDIT: A tu le livre "Programmation Cocoa sous Mac Os X" ? Si non, je te conseil la section "boutique" de ce site
J'ai un petit soucis du meme ordre : j'ai une NSTableView alimentée via une dataSource. Un controleur "maison" permet de créer des nouveaux objets (qui sont des NSMutableDictionary) et donc de nouvelles rows. J'aimerais que lorsque la dernière cellule de mon tableau ient de finir d'etre éditée, mon controleur crée un nouvel objet, donc une nouvelle row, et QUE CETTE NOUVELLE Row SOIT EN MODE EDITION. Dans l'état actuel des choses, j'ai subclassé NSTableView et overridé textDidEndEditing:. Pas de problème en ce qui concerne le test dernière ligne et dernière colonne, pas de soucis pour la création de la nouvelle ligne, mais systématiquement, le nouveau "firstResponder" est la première ligne, comme-ci la nouvelle ligne n'existait pas. Il faut donc que l'utilisateur double clique sur la dernière row pour éditer. J'ai essayé les tableColmun selectRow: byExtendingSelection:, puis tableView editColumn: row : withAction: => Au débug, ligne par ligne les choses se passent bien, mais dès que la méthode textDidEndEditing se termine, la focus est donné à la première ligne !
Quelqu'un aurait une idée de la stratégie à adopter ?
Je n'ai jamais eu besoin de ce genre de chose donc j'aurait un peu de mal à t'aider. Mais tu semble bien parti
La méthode add: de mon controleur contient un reloadData. La table est bien à jour, mais le focus est désespérément à la première ligne après la méthode textDidEndEditing. Pas moyen de changer le firstResponder.
Mais peut-etre que je peux accéder à la nouvelle textFieldCell, mais je ne sais pas comment faire. J'ai bien accès à la dataCell de la colonne, mais la dataCell n'est pas le textField d'après la doc : il n'y a qu'une dataCell par tableColumn... Comment accéder à un textField particulier dans une tableView, et lui donner le firstResponder ?? Là est la question je crois.
Pour la dataCell il y en a une par cellule. Mais le modèle est défini une fois dans la colonne. J'espère ne pas dire de bêtise. Il est possible d'accéder à n'importe quel cellule pour lui donner le firstResponder.
Pour prendre le contrôle de la préparation des cellules d'une table :
- (NSCell *)preparedCellAtColumn:(NSInteger)column row:(NSInteger)row
j'ai effectivement déjà essayé ta suggestion de créer la nouvelle row avant, qui fonctionne bien. Mais pour le coté "pratique", c'est mieux d'attendre la dernière. Ma table ne sais effectivement pas encore qu'elle a une nouvelle ligne avant l'appel textDidEndEditing.
Je vais essayer ta méthode - (NSCell *)preparedCellAtColumn:(NSInteger)column row:(NSInteger)row que je ne connaissais pas. A quel objet faut-il envoyer cet appel ? A la tableView ? je n'ai pas trouvé cette méthode dans la doc...
Par contre il faut Mac OS X 10.5 minimum !
Oui, je sais tout cela. Le problème c'est que quand on est en mode édition, le datasource n'est pas encore mis à jour!
Donc, soit je sors du mode édition et je récupère mes données dans mon datasource, soit je récupère ce qui est affiché.
J'aimerais donc pouvoir sortir du mode édition par programmation (le sujet du fil)
Une solution consisterait à sous classer la class NSCell que tu utilise pour prendre la main sur la saisie des caractères et ainsi détecter ce que tu souhaite ! Mais sortir du mode d'édition avec le code, je ne vois pas comment faire !
Je met le code suivant dans l'initialisation :
Et ensuite on peut récupérer la cell éditée, ou/et effectuer diverses actions :
selectedCell c'est pour NSMatrix ...
La méthode la plus simple est:
[window makeFirstResponder:nil];
Une autre méthode permet de terminer l'édition même si la saisie est invalide:
- (void)endEditingFor:(id)anObject (NSWindow)
En cours d'édition, la valeur est récupérable via le field editor:
- (NSText *)fieldEditor:(BOOL)createWhenNeeed forObject:(id)anObject (NSWindow)
selectedCell est avant tout dans NSControl... Et pour avoir expérimenté ce code crois-moi il fonctionne.
Ceci dit ta proposition est pas mal non plus, c'est à essayer
Oui mais je comprends pas le concept de selectedCell pour NSTableView ...
A moins de la faire soi-même :
Je pense que c'est ça qui questionne mpergand, nativement dans une NSTableView c'est une ligne entière qu'on sélectionne, non ? pas juste une cell ?
EDIT : En utilisant la dernière méthode citée ci-dessus on peut sortir du mode édition comme ceci :