CoreData Premiers pas avec Binding

Bonjour,


 


Je fais mes premiers pas avec Core Data avec une application simple. (note pour Aligator : j'utiliserai Magical Record la prochaine fois, je n'aime pas griller les étapes d'apprentissage;-) )


 


J'ai donc fait une application toute simple : une entity avec 3 attributs. J'utilise dans mon fichier xib un arraycontroller liée à  mon entity. J'ai crée des boutons Add et Remove liés aux actions équivalentes dans mon arraycontroller, j'ai fait un binding de mes TableColumn vers arraycontroller.arrangedObjects.myAttribut. Je me suis aidé du livre d'Aaron Hillegas (mais l'édition que j'ai date d'xCode 3 et je suis sous xCode 5)


 


Ce qui fonctionne Add et Remove fonctionne ; Undo fonctionne ; Auto Save aussi


 


Par contre impossible d'éditer les valeurs bien que les cell soit en mode editable.


 


Le fichier XML générer par la sauvegarde contient bien le nombre d'enregistrement créés avec le bouton Add mais avec les valeurs par defaut des attributs (ce qui ne corresponds pas aux données affichées dans la vue).


 


Je pense qu'il s'agit d'un problème de Binding mais je ne sais pas où. Peut être dans ce que je présente dans la vignette ??


 


Si je ne suis pas clair dans mes explications vous pouvez me posez vos questions. D'avance merci de vos réponses


 


s


e


b


Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur
    octobre 2013 modifié #2
    Ouais, OK, t'as bindé la colonne de la table view, mais comment as-tu bindé le NSArrayController sur le MOC ?
    Je te conseille de créer quelques entités dans ton MOC à  sa création, ça permettra déjà  de voir si ça affiche quelque chose.

    Et sinon, si tu n'as jamais travaillé avec les bindings, sache que c'est une techno qui est aussi délicate à  mettre en oe“uvre que Core Data, alors découvrir les deux en même temps est à  proscrire.
  • Merci Céroce de ton intérêt.


     


    Je ne sais pas ce qu'est le MOC (?)


     


    Mais manger un bon petit plat de carotte des sables rend aimable (c'est à  voir) mais aussi libère l'esprit (en tout cas le mien). Je viens de trouver mon oubli le plus grossier. J'avais oublié le Binding de la tableview : tableContent -> Entity.arrangedObject et Entity.selectionIndexes


     


    Autre problème les Binding value sont à  mettre dans le TextField et non pas dans TableCellView. Il faut bien vérifier avec quel objet on travail dans IB dans la liste à  gauche en texte plutot qu'en le pointant dans l'UI.Ce n'est pas toujours clair quand on clique sur une table view, table column, table cell view, text field, text field cell,... (c'est un peu le bordel à  la souris)


     


    L'application semble fonctionner correctement je vais faire des tests plus approfondis avant d'aller plus loin et commencer à  écrire le code dont j'ai besoin.


     


    Je suis d'accord avec toi sur le fait que CoreData et Binding sont difficiles à  aborder mais ensemble le fonctionnement (quand il fonctionne) est hallucinant au niveau du code. Pour le moment je n'ai pas écris une ligne de code et j'ai une très grosse quantité de fonctionnalité (load, save, undo, sort, etc...)


     


    Bonne soirée


     


    s


    e


    b


  • CéroceCéroce Membre, Modérateur

    Merci Céroce de ton intérêt.

    Il n'y a pas de quoi vraiment ;-)

    Je ne sais pas ce qu'est le MOC (?)

    Managed Object Context. J'aurais dû le préciser, même si on voit souvent cet acronyme.
     

    Mais manger un bon petit plat de carotte des sables rend aimable (c'est à  voir) mais aussi libère l'esprit (en tout cas le mien).

    ça donne aussi une bonne vue. T'as déjà  vu un lapin avec des lunettes ?

    Autre problème les Binding value sont à  mettre dans le TextField et non pas dans TableCellView.

    Je n'ai à  présent bindé que des tables views basées sur des NSCells, mais ce que tu écris paraà®t correct pour une table basée sur des NSViews.
     

    Je suis d'accord avec toi sur le fait que CoreData et Binding sont difficiles à  aborder mais ensemble le fonctionnement (quand il fonctionne) est hallucinant au niveau du code. Pour le moment je n'ai pas écris une ligne de code et j'ai une très grosse quantité de fonctionnalité (load, save, undo, sort, etc...)

    Moi, aussi je suis d'accord avec moi-même... sache que je binde souvent par le code. ça me parait plus clair que par IB, qui t'empêche parfois de mettre en place des bindings totalement valides. Le problème des bindings, c'est que justement, non, ce n'est pas magique, et qu'il faut bien comprendre comment fonctionne chaque pièce (Key-Value Coding, Key-Value Observing, NSBindingCreation) pour parvenir à  résoudre le moindre problème.


  • Je n'ai à  présent bindé que des tables views basées sur des NSCells, mais ce que tu écris paraà®t correct pour une table basée sur des NSViews.




    Il y a sûrement une raison d'utiliser les NSCells à  la place de NSViews. Je viens de l'apprendre à  mes dépends.


     


    Errare humanum est, perseverare diabolicum


     


    Tant que l'on utilise des attributs de type NSString le binding des NSViews semble fonctionné (les NSView doivent retourné des NSString (?). Mais lorsque l'on utilise des attributs de type numérique cela ne fonctionne plus un string dans int vous n'y pensez pas ! Il faut utiliser un Number Formater sur la NSCell qui permet de passer d'un NSNumber à  une NSString.


     


    Je corrige donc cette erreur.


     


    --


    seb

  • CéroceCéroce Membre, Modérateur

    Il y a sûrement une raison d'utiliser les NSCells à  la place de NSViews. Je viens de l'apprendre à  mes dépends.

    En fait, les NSCells sont plus légères que les NSViews, c'est pourquoi elles sont utilisées un peu partout (au moins chaque héritier de NSControl) dans AppKit. Mais il est très complexes de faire des assemblages de NSCells, justement par exemple, pour personnaliser des cellules d'une NSTableView. Alors, depuis Mac OS 10.7, Apple permet d'utiliser des NSViews dans une NSTableView, et tu n'imagines même pas à  quel point ça simplifie la vie.
     

    Tant que l'on utilise des attributs de type NSString le binding des NSViews semble fonctionné (les NSView doivent retourné des NSString (?). Mais lorsque l'on utilise des attributs de type numérique cela ne fonctionne plus un string dans int vous n'y pensez pas ! Il faut utiliser un Number Formater sur la NSCell qui permet de passer d'un NSNumber à  une NSString.

    C'était déjà  ainsi. La NSCell de base ne permet d'avoir que deux types de valeurs: soit une NSString, soit une NSImage. Avec des NSCells plus complexes, il fallait déjà  faire ce type de conversions.
  • Salut je remonte un sujet sur les Binding que j'ai en parti résolu (merci Ceroce)


     


    Mon problème du jour vient de l'utilisation des binding avec une colonne remplie de combo box cell.


     


    Je m'explique j'utilise une entity coredata qui contient un entier et une description. J'ai crée un petit projet avec une tableview et tout fonctionne nickel en binding tant que j'utilise des textfield cell. 


     


    Pour aller plus loin je voudrais utilisé une valeur (nsinteger) afin d'afficher le contenu d'une combo box cell et là  je bug sur le binding à  faire.


     


    Pour résumer je voudrais remplacer :


     


    0 - Description 1


    1 - Description suite


    2 - Encore une description


    1 - Une dernière description


     


    Par :


     


    Port A - Description 1


    Port B - Description suite


    Port C - Encore une description


    Port A - Une dernière description


     

    Vous aurez compris que les valeurs de mon nsinteger sont (0 -> Port A ; 1 -> Port B ; 2 Port C).

     

    J'ai déjà  tenté plusieurs binding mais rien ne fonctionne

     

    D'avance merci de votre aide. N'hésitez pas à  demander des précisions. Une petite capture d'écran du résultat escompté : 

  • CéroceCéroce Membre, Modérateur

    Avec les bindings, quand il y a une conversion à  faire entre le modèle et la vue, il faut utiliser un NSValueTransformer.


  • iLandesiLandes Membre
    février 2014 modifié #9

    Ce qui veut dire qu'il faut que je créé un NSValueTansformer pour convertir 0 en "Port A", 1 en "Port B" etc. ??


     


    Je comprends pas trop car j'utilise uniquement des entiers. Il faudrait transformer quoi en quoi?


     


    --


     


    Un petit tour dans la doc (NSValueTansformer) et j'ai trouvé et mis en application la solution pas si compliqué que cela à  comprendre


     


    Merci encore céroce.


  • Attention, si tu utilises des bindings vers des attributs d'entités numériques, il faut ajouter (dans IB) un NumberFormatter au textfield de la cellule, sinon Core Data ne va pas aimer... -_-


  • Oui, cela je m'en étais rendu compte merci


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