UITableView et custom id

KiraxKirax Membre
juillet 2014 modifié dans API UIKit #1

Bonjour,

 

Voila un moment que je cherche, je me decide a venir vers vous

 

Je suis actuellement en train de creer une table view qui me permettras ensuite d'aller vers un autre table view (différente selon la ou on clic) acttuelement elle fonctionne j'affiche mes donner comme il faut mon probleme c'est que quand on clic j'aimerais bien s'avoir ce que l'utilistaur a choisi j'arrive a faire remonter le champ text mais j'aurais besoins que ce soit un id que j'ai défini (mes donnée arrive en json) je récupere en faite deux colonne une avec les titre des champ et l'autre avec les id au quelle il corresponde mais j'arrive pas a ajouter l'id dans la var "cell" je vous partage mon code pour un coup de main

 

en fait je voudrais creer une variable dans chaque "cell" avec comme parametre le tableau _idtable et la récupere dans "- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath"

 

Merci d'avance, Cordialement

 
https://www.dropbox.com/s/nrpydsnsqbskb3x/listFromViewController.h
https://www.dropbox.com/s/vivt27fdz9675i3/listFromViewController.m


 


Modérateur: sujet déplacé, merci de poster dans la bonne section.


«1

Réponses

  • NasatyaNasatya Membre
    juillet 2014 modifié #2

    Ok je penses que tu te prends la tête pour rien. N'essais pas de modifier la structure de ta cell pour ça. Dans le "array" que tu as en datasource de ton tableView tu dois faire en sorte de mettre le champs texte mais aussi l'id que tu souhaite récupérer tu peux faire en sorte par exemple de créer un model MonObjet qui contiendra ton champs texte et ton id et d'en faire un array. 



    //Définir MonObject dans une classe à  part avec la méthode initWithDictionary
    NSMutableArray *monDataSource = [NSMutableArray array];
    for (NSDictionary *dictionary in monJsonArray) {
    MonObject *monObject = [[MonObject alloc] initWithDictionary:dictionary];
    [monDataSource addObject:monObject];
    }

    Comme ça dans ta cell tu fera un



    MonObjet *monObjet = [monDataSource objectAtIndex:indexPath.row];
    cell.textLabel.text = monObjet.champTexte;
    return cell;

    et dans ton didSelectRow tu pourras faire un 



    MonObject *monObject = [monDataSource objectAtIndex:indexPath.row];
    int monId = monObject.unId;

    Comme ça tu as accès à  tous ce que tu veux dans ton didSelectRow.


    A noter que tu peux aussi faire ça à  base de dictionnaire inclus dans des arrays ça fera plus ou moins la même chose à  la fin.


  • Joanna CarterJoanna Carter Membre, Modérateur
    Il te faut sous-classer UITableViewCell et enregistrer ce sous-classe avec un "reuse identifier". Puis tu pourras "dequeue" une instance de ce type de cellule au lieu de UITableViewCell.


    Du coup, tu peux ajouter n'importe quels @propertys à  la sous-classe
  • Premièrement merci pour vos réponses. 


    Deuxièmement je regarde ca demain dès que j'arrive au boulot.


    Troisièmement un grand merci je vous tiens au courant. :)


  • KiraxKirax Membre
    juillet 2014 modifié #5

    Bonjour,


     


    Il me dit : No visible @interface for 'cellListFormView' declares the selector 'initWithDictionary:'


     


    :/


     


    je vous donne le fichier qui contiens mon objet que je viens de creer


    https://www.dropbox.com/s/1weormcfzchabzs/listFormViewController.m


     


    J'ai trouver pour l'erreur je l'avais creer en NSObject et non en NSDictionary


  • NasatyaNasatya Membre
    juillet 2014 modifié #6

    C'est parce qu'il faut créer la méthode 'initWithDictionary' fait attention au convention de nommage 'cellListFormView' c'est une classe tu devrais mettre une majuscule 'CellListFormView' 


    Sinon il faut le créer en NSObject


    Un truc dans le genre 


    Dans le .h



    #import <Foundation/Foundation.h>

    @interface MonObject : NSObject
    @property (nonatomic, strong) NSString *monTexte;
    @property (assign) int monId;
    -(id)initWithDictionary:(NSDictionary *)dictionary;
    @end ;

    Dans le .m



    #import "MonObject.h"

    @implementation MonObject

    - (id)initWithDictionary:(NSDictionary *)dictionary
    {
    self = [super init];
    if (self) {
    _monId = [[dictionary objectForKey:@monId] intValue];
    _monTexte = [dictionary objectForKey:@monTexte];
    }
    return self;
    }

    @end

  • Joanna CarterJoanna Carter Membre, Modérateur
    juillet 2014 modifié #7

    Si je peux te renseigner, la syntaxe pour accéder les dictionnaires est devenue plus facile :



    - (id)initWithDictionary:(NSDictionary *)dictionary
    {
    self = [super init];

    if (self)
    {
    _monId = dictionary[@monId].intValue;

    _monTexte = dictionary[@monTexte];
    }

    return self;
    }


    https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/FoundationTypesandCollections/FoundationTypesandCollections.html#//apple_ref/doc/uid/TP40011210-CH7-SW22


     


    ... et les paragraphes suivants


  • Désoler je voit pas dutout :/ ou je lui donne mes variable vu que l'objet je lui donne aucune info comment il peut les récipere ?


  • Ok je vois le souci. 



    DBAccess *dba = [[DBAccess alloc] init];
    _recep = [dba getDataSQL: @SELECT * FROM listForm];
    _recipes = [dba clearColumArray:_recep :0];
    _idtable = [dba clearColumArray:_recep :2];

    //Ici tu disais que les données étaient tiré d'un json normalement un json tu peux le
    //transformer en array qui contient des variable.
    //Il faut qu'ici tu es un array qui contiennent tes données ou une autre source que tu //pourrais parser.
    _fullList = [[NSMutableArray alloc] init];

    //Ici ton tableau _fullList est vide tu ne passeras pas dans la boucle for peut être te servir
    //de ton array _recept qui à  l'air de contenir ce que tu veux
    for (NSDictionary *dictionary in _fullList) {

    //L'objet CellListFormView doit être un NSObject
    //et contenir une méthode d'initialisation exemple "initWithDictionary"
    cellListFormView *monObject = [[cellListFormView alloc] initWithDictionary:dictionary];

    //Cela ajoute des données et ne les remplace pas du coup tu risque d'avoir
    //2 fois trop de données dont la moitié ne correspondant pas à  ce que tu veux.
    [_recep addObject:monObject];
    }
    NSLog(@%@", monObject);

    Pour moi ton _recept est une liste de dictionnaire contenant toutes les données que tu souhaites utiliser une version du coup plus simple pour ce que tu veux faire (bien que les models soit quand même pas mal) ça serait ça.


     


    Dans ton cellForRow 



    NSDictionary *myDictionary = [_recept objectAtIndex:indexPath.row];
    cell.textLabel.text = [myDictionary objectForKey:@laCleDuChampTexte];
    return cell;

    Et dans ton selectedRow



    NSDictionary *myDictionary = [_recept objectAtIndex:indexPath.row];
    int monId = [[myDictionary objectForKey:@laCleDeMonId] intValue];

    Après à  voir si tu as bien un array de dictionary dans recept il faut adapter un peu tout ça mais bon le problème est simple dans ton recept tu as toutes les données que tu veux si elles ne sont pas facilement accessible alors tu dois les arranger autrement (création de model ou arrangement dans un dictionnaire ou autre si tu vois une autre solution simple) et puis les relire directement dans les méthodes delegate et datasource de ton tableView.


  • du coup je peut copier directement ton code ?


    La javoue que ca fait un moment que je tourne dessus (plusieurs jour a plein temps) et ca commence a me rendre un peut fou donc j'aimerais vite le coucher ce truc de galère (UITableView)


  • NasatyaNasatya Membre
    juillet 2014 modifié #11

    Mon code n'est pas sous license si c'est la question ::)   après est ce que ça fera ce que tu veux je sais pas il faudrait au moins que j'ai le log de ton _recept pour savoir ce qu'il contient et être un peu plus sur que ça fonctionne. Mais dans le principe ça doit le faire si tu change les clés du dictionnaire évidemment.


  • je te transmet tout comme ca ce seras nikel :p


     


    donc dans un premier temps les fichier 


    https://www.dropbox.com/sh/obgl0mvxrm96gl4/AAAThpX84njlm-YZNwMgJeV3a


     


    dans un deuxième temps les log parceque il me fait une erreur dans les tableau assez bizzare


     



     


    2014-07-24 14:38:37.066 melanie[2708:351673] SELECT * FROM listForm WHERE cmp_id='1'


    2014-07-24 14:38:37.070 melanie[2708:351673] SELECT * FROM listForm WHERE cmp_id='6'


    2014-07-24 14:38:37.083 melanie[2708:351673] (


    )


    2014-07-24 14:38:37.100 melanie[2708:351673] -[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x17d902a0


    2014-07-24 14:38:37.101 melanie[2708:351673] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x17d902a0'


    *** First throw call stack:


    (0x2cd6f777 0x39e4dd13 0x2cd74ac9 0x2cd729df 0x2cca5578 0x7ea47 0x307427c3 0x30742887 0x3073838b 0x30551233 0x3047bd65 0x2fead0cd 0x2fea8ab5 0x2fea893d 0x2fea8321 0x2fea8125 0x3047d72b 0x2cd35f77 0x2cd35387 0x2cd339ed 0x2cc82a21 0x2cc82833 0x34272111 0x304ddedd 0x7f1c5 0x3a3d2aaf)


    libc++abi.dylib: terminating with uncaught exception of type NSException



     


    je comprend pas trop deja pourquoi il me fait de tel requete sur la BDD

    de plus il semple que le fullList reste vide :/


    Un grand merci pour ton coup de main la je craque :/


  • Bon j'ai enlevé ce que je pensais en trop et changé le count dans les datasource c'est plus logique comme ça. J'ai ajouté un NSLog sur recept si tu peux me log parce que sans ça il ne sera pas facile de t'aider plus.


    Bon courage


     


    https://www.dropbox.com/s/6b59x7jd5f3etbu/listFormViewController.m


  • il me sort une erreur sur les tableau :/


     



     


    2014-07-24 15:11:05.175 melanie[2935:364141] recep = (


            (


            "demo 2",


            "{\n    items =     (\n                {\n            key = field;\n            properties =             {\n                \"default_value\" = \"\";\n                mandatory = 0;\n                title = \"Nom et pr\\U00e9nom\";\n                type = text;\n            };\n        },\n                {\n            key = picture;\n            properties =             {\n                mandatory = 0;\n                \"multiple_pictures\" = 0;\n                title = \"Choisir une photo\";\n            };\n        }\n    );\n    nbrSoumission = infinity;\n    publish = 1;\n    published = 1;\n    title = \"demo 2\";\n}",


            1


        ),


            (


            "demo2 ",


            "{\n    items =     (\n                {\n            key = picture;\n            properties =             {\n                mandatory = 0;\n                \"multiple_pictures\" = 0;\n                title = Photo;\n            };\n        },\n                {\n            key = field;\n            properties =             {\n                \"default_value\" = \"\";\n                mandatory = 0;\n                title = \"Champ de saisie\";\n                type = text;\n            };\n        }\n    );\n    nbrSoumission = 3;\n    publish = 1;\n    title = \"demo2 \";\n}",


            6


        )


    )


    2014-07-24 15:11:05.193 melanie[2935:364141] -[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x1555a000


    2014-07-24 15:11:05.194 melanie[2935:364141] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x1555a000'


    *** First throw call stack:


    (0x2cd6f777 0x39e4dd13 0x2cd74ac9 0x2cd729df 0x2cca5578 0x64abf 0x307427c3 0x30742887 0x3073838b 0x30551233 0x3047bd65 0x2fead0cd 0x2fea8ab5 0x2fea893d 0x2fea8321 0x2fea8125 0x3047d72b 0x2cd35f77 0x2cd35387 0x2cd339ed 0x2cc82a21 0x2cc82833 0x34272111 0x304ddedd 0x65229 0x3a3d2aaf)


    libc++abi.dylib: terminating with uncaught exception of type NSException


  • Je sais pourquoi il fait l'erreur sur le tableau c'est parce qu'on essai de lire dans un dictionary alors que c'est un array c'est pas super grave on arrangera ça plus tard désolé de t'embêter avec les log mais est ce que tu peux m'envoyer en même temps ceux de


    _recipes et _idtable s'il te plait... Parce que je penses que pas que chercher directement dans _recep soit une bonne idée finalement ;)


  • a quelle moment tu veut les récupère ?



  •  


     


    2014-07-24 15:23:14.388 melanie[2964:367272] SELECT * FROM listForm WHERE cmp_id='1'


     


    2014-07-24 15:23:14.391 melanie[2964:367272] SELECT * FROM listForm WHERE cmp_id='6'


    2014-07-24 15:23:14.404 melanie[2964:367272] recipes = (


        "demo 2",


        "demo2 "


    )


    2014-07-24 15:23:14.405 melanie[2964:367272] recep = (


            (


            "demo 2",


            "{\n    items =     (\n                {\n            key = field;\n            properties =             {\n                \"default_value\" = \"\";\n                mandatory = 0;\n                title = \"Nom et pr\\U00e9nom\";\n                type = text;\n            };\n        },\n                {\n            key = picture;\n            properties =             {\n                mandatory = 0;\n                \"multiple_pictures\" = 0;\n                title = \"Choisir une photo\";\n            };\n        }\n    );\n    nbrSoumission = infinity;\n    publish = 1;\n    published = 1;\n    title = \"demo 2\";\n}",


            1


        ),


            (


            "demo2 ",


            "{\n    items =     (\n                {\n            key = picture;\n            properties =             {\n                mandatory = 0;\n                \"multiple_pictures\" = 0;\n                title = Photo;\n            };\n        },\n                {\n            key = field;\n            properties =             {\n                \"default_value\" = \"\";\n                mandatory = 0;\n                title = \"Champ de saisie\";\n                type = text;\n            };\n        }\n    );\n    nbrSoumission = 3;\n    publish = 1;\n    title = \"demo2 \";\n}",


            6


        )


    )


    2014-07-24 15:23:14.407 melanie[2964:367272] idtable = (


        1,


        6


    )


    2014-07-24 15:23:14.424 melanie[2964:367272] -[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x14d7b300


    2014-07-24 15:23:14.425 melanie[2964:367272] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x14d7b300'


    *** First throw call stack:


    (0x2cd6f777 0x39e4dd13 0x2cd74ac9 0x2cd729df 0x2cca5578 0x8baa3 0x307427c3 0x30742887 0x3073838b 0x30551233 0x3047bd65 0x2fead0cd 0x2fea8ab5 0x2fea893d 0x2fea8321 0x2fea8125 0x3047d72b 0x2cd35f77 0x2cd35387 0x2cd339ed 0x2cc82a21 0x2cc82833 0x34272111 0x304ddedd 0x8c20d 0x3a3d2aaf)


    libc++abi.dylib: terminating with uncaught exception of type NSException



    Le coup des deux where aussi je trouve ca super bizarre aucun moment je lui demande de me les faire du coup il doit avoir en plus des résultat de requête erronée 


  • Ben au même moment que mon log pour le _recep.


     


    Par contre as tu bien lu la documentation pour DBAcess je trouve pas plus de documentation que ça... J'ai trouvé un framework mais je suis pas sur que ça soit celui que tu utilise.


  • Et dans tout ça c'est quoi que tu veux récupérer?


  • KiraxKirax Membre
    juillet 2014 modifié #20

    DBAcess c'est moi qui l'est écrite 


     


    https://www.dropbox.com/s/z049xe4vgw49210/DBAccess.h


    https://www.dropbox.com/s/h4f1iqft5hjqrrw/DBAccess.m


     


    je veut juste récupere le titre pour l'affichier et l'id qui est extrait lui aussi de la BDD


     


    862292ScreenShot20140724at153431.png


  • Je me demande quand même si avant de réparer ta classe tu ferais pas mieux de mieux comprendre ton outil DBAccess pour qu'il te renvoie des objet plus exploitable. Parce que la on finira bien par t'afficher ce que tu veux mais je te garantie pas que ça soit simple maintenable et surtout robuste.


  • Oui mais quel titre y en à  partout  title = \"Nom et pr\\U00e9nom\",   title = \"Choisir une photo\", title = \"demo 2\" et ça juste dans la même ligne.


  • Ok alors suivant le tableau j'imagine que c'est demo2 et l'id 1 par exemple. Ok.


  • ouais c'est noramle j'ai besoins de le garder comme ca c'est pour mes json derière :/


  • Exactement je veut qu'il m'affiche en faite Demo2 dans la liste et quand je clic il me renvoie 1 en gros son id :/ vu que il est possible quelle est le meme nom je peut pas check avec le nom :/


  • Ok essais ça https://www.dropbox.com/s/ncktnvu14wg7vmt/listForm.zip  je penses que ça devrait le faire. 


    Regarde bien c'est juste une gestion de NSArray rien de bien méchant et surtout renomme cette classe avec une majuscule ça fait vraiment mal aux yeux.


  • Et pour ta classe tu fais une belle classe qui te ramene un beau model facilement utilisable dans ton model tu ajoutes une méthode toDictionary qui transforme ton model en dictionnaire et puis avec la méthode du sdk apple tu le transforme en json comme ça tu as un objet facilement utilisable dans ton application qui a la capacité de devenir un json en temps voulu.


  • il me sort des erreur que je voit pas trop comment résoudre 



     


    listFormViewController.m:70:36: Property 'cmpTitle' not found on object of type 'cellListFormView *'; did you mean to access instance variable 'cmpTitle'?


    et 


    listFormViewController.m:85:27: Property 'cmpId' not found on object of type 'cellListFormView *'; did you mean to access instance variable 'cmpId'?



    :/ en tout k un gros merci de m'aider


  • Alors deux chose c'est vrais qu'aujourd'hui on a plus l'habitude de voir des variables déclarés avec des property


    @property (nonatomic, strong) NSString *cmpTitle;


    @property (assign) int cmpId;


     


    Ensuite as tu déjà  renommé la classe?


    Est tu sur qu'elle soit référencé dans ton code?


     


    L'erreur est clair le compilateur ne trouve pas les objets dans ta classe alors soit il voit pas la classe soit il voit pas les objet dedans le tout est de faire des tests.


  • KiraxKirax Membre
    juillet 2014 modifié #30

    J'ai prit tout les fichier que tu ma renvoyer et j'ai tout mit dedans donc normalement pas de souci :/ et mon id est en NSString et j'aimerais le garder comme ca :/


  • allors du coup je l'est passer en NSString mais la il me sort un nouveau truc mdr


     



     


     *** Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:], /SourceCache/UIKit/UIKit-3283.1/UITableView.m:7305


    2014-07-24 21:54:40.907 melanie[3535:465274] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'


    *** First throw call stack:


    (0x2cd6f777 0x39e4dd13 0x2cd6f64d 0x2da86f1f 0x305a936f 0x307427db 0x30742887 0x3073838b 0x30551233 0x3047bd65 0x2fead0cd 0x2fea8ab5 0x2fea893d 0x2fea8321 0x2fea8125 0x3047d72b 0x2cd35f77 0x2cd35387 0x2cd339ed 0x2cc82a21 0x2cc82833 0x34272111 0x304ddedd 0xbd221 0x3a3d2aaf)


    libc++abi.dylib: terminating with uncaught exception of type NSException



    Desoler je sait que je suis relou mais cette view me rend dingue


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