Bindings sur une custom NSTableViewCell
Bonjour à tous !
Je me mets aux NSTableViewCell et il y a quelque chose que je comprends pas.
J'ai une classe CustomCell et le XIB correspondant est inclus directement dans la NSTableView. Dans le code, la cell est instanciée par
CustomCell *cellView = [tableView makeViewWithIdentifier:[CustomCell identifier]
owner:self];
(self = le dataSource de la table view)
1ère question :
J'ai réussi à créer des IBOutlets entre CustomCell.m et le XIB. Mais je ne comprends pas pourquoi ça marche car le "owner" de la cell est le dataSource de la table view.
2ème question :
De plus, comment puis-je faire des bindings sur les labels, button, etc. de CustomCell ? Il faudrait que j'ai un FileOwner spécifique pour ce CustomCell.
En fait, si certains d'entre vous ont déjà fait des bindings avec des custom cell, ce qui m'intéresse, c'est surtout de savoir comment on fait ;-)
Merci !
Colas
Réponses
PS : j'avance à petits pas, mais pour l'instant, je n'y suis pas arrivé.
J'ai créé un NSArrayController dans mon XIB et j'ai bindé la TableColumn avec le content de mon ArrayController : cela marche, il y a bien autant de cells que d'objets dans mon arrayController.
Reste maintenant à binder les labels, buttons, etc. de ma CustomCell avec des @property des objets du ArrayController.
Pour l'instant, j'ai essayé de binder à ArrayController.selection.myTitle (pour obtenir la valeur myTitle de mon object modèle)... mais ça ne marche pas.
De mémoire tu as une propriété "objectValue" sur la tableViewCell qui correspond à ton l'object (ou un proxy de l'objet) à afficher (il est renseigné automatiquement). De fait, il faut "binder" les textFields et autres label avec objectValue.<la propriété de mon objet>.
Merci Lexxis !
Oui, je m'en suis sorti comme ça, effectivement mais il y a encore un truc que je ne comprends pas....
Ma NSTableView est bindée au NSArrayController, les attributs de la cell sont bondés sur objectValue.
Ma table view n'a pas de dataSource (dans IB)
MAIS si je n'ai pas le code qui suit dans le .m, ça ne marche (ma TableView est vide)
Comprends-tu pourquoi je dois avoir ce code en plus du ArrayController et du binding ?
J'avoue que ça fait plusieurs mois (voire plus) que je n'ai pas fait de ArrayController et de binding.
Mais, bon, pour l'instant ça marche.
PS : au début, MyCustomCell héritait de NSView et pas NSTableViewCell : je n'avais alors pas accès au binding "objectValue" dans IB.
J'utilise des UITableView pour mes gestions banques de sons. Il y a dans IB deux "outlets" à connecter depuis la UITableView et l'icône correspondant à la UIViewController : "delegate" et "dataSource". Dans le UIViewController, tu crées la liste à afficher dans la table, et les méthodes d'utilisation. Cela doit être la même chose sous MacOS (bizarrement, je n'en ai pas utilisé dans mes applis Mac)
Il y a normalement tout un paquet de méthodes à installer, en plus des tiennes (voir la doc)
Tu es forcément obligé de passer par une dataSource pour peupler ton UITableview. Mais le ArrayControleur peut être cette dataSource.
As tu modifié le nom de la classe de la tableViewCell dans IB (surtout si tu as du code spécifique dans 'MyCustomCell'.
Les bindings sont-ils configurés dans IB ou par code ?
Peut être un paramètres à renseigner au niveau du ArrayController (nom de la classe ou autres...)...
J'essaierai de déclarer le arrayController comme dataSource.
Je me disais que vu que j'avais bindé le "contentObject" (je n'ai pas le nom exact là ) de la tableView au ArrayController, c'etait automatique qu'il soit le dataSource.
Oui j'ai bien mis le nom de la classe MyCustomCell.
J'ai fait les bindings dans IB. Dans le ArrayController, j.ai mis le nom de l'Entité. J'essaierai de connecter dans IB le dataSource de la TableView au ArrayController.
Entité ? Utilises-tu CoreData ?
Oui le ArrayController est rempli via Core Data.
(a priori je ne pense que c'est en jeu)
Bon, en connectant via IB le dataSource de la TableView au ArrayController et en enlevant la méthode
ça ne marche plus, ma table reste désespérément vide.
Tu as un tutoriel là qui a l'air complet :
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/Introduction/Introduction.html#//apple_ref/doc/uid/10000026i-CH1-SW1
et un autre là , d'un site qui m'a déjà été utile pour autre chose, avec code source :
https://www.raywenderlich.com/118835/os-x-nstableview-tutorial
Comme toujours avec Apple, c'est très simple, mais il faut connaà®tre! )
Merci Hervé, ça ne m'a pas trop aidé malheureusement.
Je viens de découvrir un aspect encore plus bizarre.
Mon .m est le delegate de la TableView, mais n'implémente aucune méthode.
Si je set le delegate de la TableView à nil (via IB), alors, pareil, ma TableView n'affiche plus rien....
Peut être un paramètre du NSArrayController (genre PrepareContents ou autre).
As tu un message dans la console ?
PrepareContents n'a rien changé... et je n'ai pas de message dans la Console.
Bon, mon problème n'est pas bloquant puisque ça marche... mais bizarrement et pas comme ça devrait
Merci de ton aide ;-)
Si tu peux éventuellement partager ton code je peux y jeter un oeil.
Après tests, les bindings ne marchent pas sur ma NSTextView...
Edit : si, ça marche, après avoir coché "Continuously update value"