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
Réponses
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
Managed Object Context. J'aurais dû le préciser, même si on voit souvent cet acronyme.
ça donne aussi une bonne vue. T'as déjà vu un lapin avec des lunettes ?
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.
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.
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'é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
Avec les bindings, quand il y a une conversion à faire entre le modèle et la vue, il faut utiliser un NSValueTransformer.
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