Bindings sur une custom NSTableViewCell

colas_colas_ Membre
avril 2016 modifié dans API AppKit #1

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)



    - (NSView *)tableView:(NSTableView *)tableView
       viewForTableColumn:(NSTableColumn *)tableColumn
                      row:(NSInteger)row
    {
        MyCustomCell *cellView = [tableView makeViewWithIdentifier:[MyCustomCell identifier]
                                                               owner:self];
        
        return cellView;
    }

    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)

  • @hervé a priori mon but est de ne pas utiliser les méthodes de dataSource et que tout soit pris en charge par le ArrayController.
  • DrakenDraken Membre
    avril 2016 modifié #7

    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...)...

  • Tu es forcément obligé de passer par une dataSource pour peupler ton UITableview. Mais le ArrayControleur peut être cette dataSource.




    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.
  • 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...)...




    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.


  • 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 ? 

  • colas_colas_ Membre
    avril 2016 modifié #12

    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



    - (NSView *)tableView:(NSTableView *)tableView
       viewForTableColumn:(NSTableColumn *)tableColumn
                      row:(NSInteger)row

    ç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"


Connectez-vous ou Inscrivez-vous pour répondre.