Débugage.

gogaulegogaule Membre
19:22 modifié dans API AppKit #1
Bonjour à  tous
Grand consommateur de Cocoa , cherche de l'aide  :-\\ (encore!)...
Quelques lignes de code    c'est grave Dr ......
Merci    Cordialement
«134

Réponses

  • psychoh13psychoh13 Mothership Developer Membre
    19:22 modifié #2
    Qu'est-ce que tu veux faire avec ce code ?
    Tu ne nous dis rien à  son propos : on ne sait pas ce qu'il doit faire, pourquoi il doit le faire, quel est le problème, etc.
    Il manque beaucoup d'informations, tu auras beaucoup de mal à  obtenir de l'aide avec ce genre de message...
  • schlumschlum Membre
    19:22 modifié #3
    Et j'ajouterai qu'il est mal indenté donc peu lisible  >:)
  • schlumschlum Membre
    19:22 modifié #4
    Houlà , d'ailleurs il n'est pas seulement mal indenté, y a une accolade qui est au mauvais endroit dans le second bout de code !
  • gogaulegogaule Membre
    19:22 modifié #5
    Bonjour à  tous .
    Je voudrais faire fonctionner un tableau ... dure dure .
    Par exemple comment lui faire reconnaitre 11 column  et un nombre illimité de row ???
    NSString *identifier-=[aTableColumn identifier]; et après je ne trouve pas .
    schlum quelle accolade ?
    Merci a tous .
  • psychoh13psychoh13 Mothership Developer Membre
    19:22 modifié #6
    Il parle de l'accolade qui se trouve juste après @implementation AppController... Celle-ci est très mal placée... Il ne devrait pas y avoir d'accolade à  cet endroit, mais elle devrait être après le nom de la fonction pour contenir sa définition.

    Sinon pour ton problème de tableau toujours aussi peu détaillé...
    Pour commencer, dans Interface Builder, tu glisses un NSTableView sur ta fenêtre et en utilisant l'inspecteur tu lui mets 11 colonnes, ensuite tu donnes un identifier à  chaque colonne, et pour finir tu lis sont outlet "dataSource" à  un objet qui servira donc de source de données au tableau.
    L'objet doit appartenir à  une classe qui définit les méthodes :
    - (int)numberOfRowsInTableView:(NSTableView *)aTableView;<br />- (id)tableView:(NSTableView *)aTable View objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex;
    

    La première renvoie le nombre de ranger à  afficher, la deuxième renvoie l'objet à  afficher dans la case désignée par la colonne aTableColumn et par la rangé d'index rowIndex.

    Le plus simple est de créer une nouvelle classe dont chaque objet contiendra une rangée de données du tableau. Donc si tu as 11 colonnes dans ton tableau, cette classe contiendra 11 variables d'instances de types divers et variés. Les identifiants (pas les noms) des colonnes doivent être les mêmes que les noms des variables d'instance pour faciliter les choses.

    Ensuite, ton dataSource aura comme variable d'instance principale un NSMutableArray qui contiendra uniquement des instances de la classe décrite ci-dessus. Pour finir, dans la méthode
    - (int)numberOfRowsInTableView:(NSTableView *)aTableView;
    
    la définition consistera simplement à  retourner le nombre d'éléments dans le NSMutableArray.
    Et enfin la méthode
    - (id)tableView:(NSTableView *)aTable View objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex;
    

    retournera chaque valeur indiquée par les "coordonnées" en utilisant la méthode
    - (id)valueForKey:(NSString *)key;
    
    tu récupères dans le NSMutableArray l'objet au rang donné et tu récupères avec l'identifiant de NSTableColumn l'objet avec valueForKey:.

    Voilà  tu as toute la procédure, au boulot...
  • gogaulegogaule Membre
    19:22 modifié #7
    Merci
    cet autre morceau de code ?
  • gogaulegogaule Membre
    19:22 modifié #8
    Psychoh13
    Merci
    Ma première tentative allait dans ce sans ....
    Autant de NSarrayController que de Column . Mais , pour le parametrage des connections bonjour l' angoisse
    Impossible de "déméler les files"......Dolipranne .......1000Kg....Hum!

    Donc j'ai essayé avec un "shell" qui transmets les infos  N° . NOMS . SCORES .
    Ou je bloque c'est pour le parametrage  ....  que lui dire .? pour qu' il insere le score au fure et a mesure
    je ne sais pas comment lui faire reconnaitre mes identifiants .....
    Toutes les infos  ou les exemples que je trouvent sont en anglais  , nous somment bête à  ce point .
    Encore merci
  • psychoh13psychoh13 Mothership Developer Membre
    janvier 2008 modifié #9
    Oula, ton code est beaucoup trop compliqué... Et faire un NSArrayController par colonne ce n'est pas du tout ce que je conseille.
    Pour commencer, quand tu as du code à  montrer, ne fait une capture d'écran ! C'est prend de la place en trop pour rien et c'est pas lisible ni recopiable pour faire des tests.
    Tu fais un copier coller de ton code et tu utilises les balises de code fournies par le forum (tu cliques sur le bouton avec # dessus pour les ajouter à  ton message).

    Il faut que tu crées une classe qui va contenir les données, et chaque colonne de ton tableau correspondra à  une variable d'instance de la classe.

    Par exemple là  tu indiques "nom", "scores", "total", "classement", et bien tu fais une classe comme ça :
    @interface ScoreJeu : NSObject {<br />&nbsp; &nbsp; NSString *nom;<br />&nbsp; &nbsp; int scores; // je ne sais pas quel type tu préfères, peut-être un type personnalisé qui sait...<br />&nbsp; &nbsp; int total;<br />&nbsp; &nbsp; int classement;<br />}<br /><br />@end
    


    Et après, tu auras UN SEUL NSMutableArray (non pas NSArrayController) qui contiendra des instances de ScoreJeu, et en utilisant valueForKey: tu récupères les valeurs de chaque objet :

    - (id)tableView:(NSTableView *)aTable View objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex<br />{<br />&nbsp; &nbsp; return [[tableauScores objectAtIndex:rowIndex] valueForKey:[aTableColumn identifier]];<br />}
    


    Cette ligne ne marche que si tu as mis comme identifiant des colonnes les mêmes noms que les variables d'instance.

    PS : dans la capture d'écran que tu nous montres tu as mis un tiret devant "classement" alors que tu as mis un underscore devant tous les autres noms.
    D'ailleurs la pratique du underscore pour les noms de variables d'instance est une pratique déconseillée, et ici elle n'est pas vraiment utile.
  • gogaulegogaule Membre
    19:22 modifié #10
    Bonsoir à  tous .
    Je n' arrête pas de me faire rentrer dedans ..javascript:void(0);.
    Dites moi , j'ai trouvé des exemples de ligne de codes dans vos files de discussions qui m' interressent :
    Puis-je les utiliser ? Dois-je demander l'autorisation à  l' auteur ?
    Merci et Cordialement .
  • psychoh13psychoh13 Mothership Developer Membre
    19:22 modifié #11
    Euh oui il faut demander l'autorisation à  l'auteur...

    Mais ce que je t'ai donné comme exemple ne va pas ?
  • gogaulegogaule Membre
    19:22 modifié #12
    Merci encore .
    Mais
    Euh .. ben .. euh !
    Je ne suis pas arrivé à  le faire fonctionné .
    Je n'osais pas le dire et te  " Vous " demander + ....?
    Impossible de rentrer du texte dans mon " Tableau "
    Oui , je suis nul .
    Vous = FOC ..
    Si je vous " envoies " quelques lignes de code de mon cru , accepterez-vous de les corriger ?
    Quelques Explications  gratuites :Retraité , veuf depuis peu , seul .. désespérément  seul ; je me " défoule" avec Xcode .Inondé de chagrin  je rame à  tous les étages .
    Cordialement.
  • psychoh13psychoh13 Mothership Developer Membre
    19:22 modifié #13
    Tu peux toujours envoyer ton projet complet.
    Tu retires le dossier build et tu le compresses pour l'envoyer...
  • Philippe49Philippe49 Membre
    19:22 modifié #14
    dans 1201195503:

    Je n'osais pas le dire et te  " Vous " demander + ....?
    ...


    "te" demander : c'est de rigueur  ...


    dans 1201195503:

    Si je vous " envoies " quelques lignes de code de mon cru , accepterez-vous de les corriger ?

    Les intervenants sur ce site partagent la même passion ...

    @+




  • gogaulegogaule Membre
    19:22 modifié #15
    /* MyObject */

    #import <Cocoa/Cocoa.h>

    @interface MyObject : NSObject
    {
    NSMutableArray *inscriptions;
    IBOutlet NSTableView *tableView;
    IBOutlet NSTableColumn *numero;
    IBOutlet NSTableColumn *noms;
    IBOutlet NSTableColumn *partie1;
    IBOutlet NSTableColumn *partie2;
    IBOutlet NSTableColumn *partie3;
    IBOutlet NSTableColumn *partie4;
    IBOutlet NSTableColumn *partie5;
    IBOutlet NSTableColumn *partie6;
    IBOutlet NSTableColumn *partie7;
    IBOutlet NSTableColumn *total;
    IBOutlet NSTableColumn *classement;

    }

    - (IBAction)additionnePartie:(id)action;
    - (IBAction)trieTotal:(id)action;

    - (int)numberOfRowsInTableView:(NSTableView *)aTableView;
    - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex;
    - (void)tableView:(NSTableView *)atableView setObjecValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex;

    - (void)updateUI;
    - (void)additionnePartie;
    @end
    cela vous parait il  '''juste'''
    Merci
    PS: vous correspond à  vous tous !
  • schlumschlum Membre
    19:22 modifié #16
    Juste, mais un peu lourd...

    IBOutlet NSTableColumn *numero,*noms,*partie1,*partie2,*partie3,*partie4,*partie5,*partie6,*partie7,*total,*classement;
    


    PS : pourquoi un besoin d'IBOutlet par NSTableColumn ? Celui du tableau ne suffit pas ?
  • gogaulegogaule Membre
    19:22 modifié #17
    On peut mettre tout sur la même ligne ?
    J'avais essayé et j'obtenais un message d' erreur.
    Donc avec cette ligne ,toutes les colonnes seront reconnues ?
    Quelle (je ne sais dire ) code permets après compile d'ecrire des infos ?
    Psychoh13 ma guidé mais je ne suis pas parvenu a trouvé les bons mots (s'est rageant )
    Merci
  • schlumschlum Membre
    19:22 modifié #18
    dans 1201208149:

    On peut mettre tout sur la même ligne ?
    J'avais essayé et j'obtenais un message d' erreur.
    Donc avec cette ligne ,toutes les colonnes seront reconnues ?
    Quelle (je ne sais dire ) code permets après compile d'ecrire des infos ?
    Psychoh13 ma guidé mais je ne suis pas parvenu a trouvé les bons mots (s'est rageant )
    Merci


    Oui, on peut tout mettre sur la même ligne...
    poru "remplir", il faut utiliser le dataSource. Nul besoin d'avoir un outlet sur chaque colonne !
  • gogaulegogaule Membre
    19:22 modifié #19
    Bonjour .
    J'ai beau lire et relire la doc que je possède , je ne comprends pas . A chaque fois que je me dit Eureka ..Ploufffff.
    J'ai declaré mon objet helper en dataSource --->initialFirstResponder ...ecris les 3 méthodes .
    Ne riez pas    sniffffff    ..GLouppp Gloubbb Glou    glouuuuuuu  Je coule ..javascript:void(0);
    C'est  ..++.. Oui , je suis trop têtu ... Qui me tendras une perche .
    Merci .
  • schlumschlum Membre
    19:22 modifié #20
    Moi je te conseille "Cocoa par la pratique" d'Aaron Hillegass, car justement le premier exemple / tuto dans son livre c'est la gestion d'un NSTableView  ;)
  • gogaulegogaule Membre
    19:22 modifié #21
    Oui schlum ,
    Merci
    J'ai lu et relu  cet article , plusieurs fois .
    Si je suis le tuto ...... Ok tout marche .
    Si le l' " adapte à  la sauce Gogaule " + rien ne fonctionne .
    Il y as des choses que je ne comprends pas .....("Lithote").
    Les " ordres de bases " sont les mêmes pour un tableau à  2 Colonnes ou à  11 colonnes ?
  • schlumschlum Membre
    19:22 modifié #22
    Peu importe le nombre de colonnes, il peut même être dynamique !

    Il y a une méthode du dataSource qui est appelée pour savoir quoi mettre à  telle ligne et telle colonne, toujours la même...

    - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex
    


    Le principe ensuite c'est d'utiliser "[aTableColumn identifier]" pour savoir de quelle colonne on parle.
  • gogaulegogaule Membre
    19:22 modifié #23
    Oui
    c'était ce que pensais avoir compris .
    [aTableColumn identifier] ok mais comment je lui dit 1ere ligne 2eme ? C'est dans les "gènes" , automatique
    Dans tous les exemples que j'ai trouvé ,il n' y as pas de "spécification"
    Oui merci , à  force d'essayer de comprendre , tout s'embrouille .
    Si je déclare 11 columns comment il s'y retrouve .?
  • schlumschlum Membre
    19:22 modifié #24
    Ben... La ligne est donnée par "rowIndex"  ???
    Après en général dans le dataSource on gère les données avec un NSArray contenant des NSDictionary
    Donc ça donne un truc du genre :

    return [[mydatas objectAtIndex:rowIndex] objectForKey:[aTableColumn identifier]];
    
  • psychoh13psychoh13 Mothership Developer Membre
    19:22 modifié #25
    Schlum, il y a plus simple que le NSDictionary, tu fais une classe contenant une variable d'instance pour chaque colonne, et les identifiants des colonnes portent les noms des variables d'instance.
  • schlumschlum Membre
    19:22 modifié #26
    Bah moi j'aime bien les NSDictionary... Surtout que Apple a déjà  implémenté tout ce qu'il faut pour que ça soit optimisé.

    Par exemple, en demandant "objectForKey", il y a une table de hashage et un algorithme de dichotomie qui fait qu'il trouve très vite l'objet.
    Alors que si on fait un objet, obtenir un système aussi performant n'est pas forcément facile.
  • psychoh13psychoh13 Mothership Developer Membre
    19:22 modifié #27
    Bah avec NSObject, tu as directement la méthode "-valueForKey:" qui fonctionne sur le même principe que pour le dictionnaire à  la différence qu'il va directement récupérer la valeur dans l'objet, et cette valeur n'a pas besoin d'être un objet, la méthode convertis directement la valeur en NSNumber par exemple s'il s'agit d'un entier ou d'un flottant.

    De plus, un NSDictionary t'oblige à  maintenir une série de clé-valeurs et oblige de tout gérer dans la classe servant de data-source, tu as en plus besoin de créer un dictionnaire pour chaque valeur, c'est-à -dire que ça va prendre deux fois plus de mémoire non seulement pour stocker les clés mais aussi les valeurs qui sont copiés par le NSDictionary en plus des tables de hachage.

    Alors qu'avec les objets la description est stockée dans un unique objet Class, les valeurs sont stockés en mémoire directement et n'ont pas un tableau de clé qui leur est attaché à  chacun d'eux, les clés permettant de reconnaà®tre chaque champ sont stockés de façon unique dans l'objet Class plutôt qu'une fois par objet. De plus, il est possible, en plus du stockage, de définir le comportement de l'objet distinctement du comportement du data source, comme l'e permet la programmation objet.
  • gogaulegogaule Membre
    19:22 modifié #28
    Schlum
    Psychoh13  (Je voulais écrire Marie @% qui )mais vous n'appréciez pas mon humour .
    Merci , pour vos très savantes explications ,
    dans 1201266255:

    Schlum, il y a plus simple que le NSDictionary, tu fais une classe contenant une variable d'instance pour chaque colonne, et les identifiants des colonnes portent les noms des variables d'instance.

    Expliquez moi  + Les identifiants portent le nom des variables (@partie1,@partie2 ...)ce que tu m'expliquait plus avant ? je n'ai pas trouvé les bons "thermes" .
    Si je parviens à  faire fonctionner mon "Chose (Majuscule)" je vous serai redevable d' un carton de Bordeaux <
  • schlumschlum Membre
    19:22 modifié #29
    Euh, j'ai du mal à  comprendre là ...
    NSObject n'implémente pas par défaut <NSKeyValueCoding>
    Ou alors tu parles des propriétés d'Obj-C 2.0

    En tout cas ça sent violemment la violation du principe d'encapsulation tout ça  :P
  • gogaulegogaule Membre
    19:22 modifié #30
    Psychoh 13
    Schlum
    Je plane déja , pas la peine d' en rajouter .
    Merci .
  • gogaulegogaule Membre
    19:22 modifié #31
    #import "MyObject.h"

    @implementation MyObject

    - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn*) row:(int)rowIndex
    {
    // Quel est l'identificateur de la colonne
    NSString *identifier = [aTableColumn identifier];
    return [row valueForKey:identifier];
    }

    - (void)tableview:(NSTableview *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(id)rowIndex
    {
    Row *row = [inscriptions objectAtIndex:rowIndex];
    NSString *identifier = [aTableColumn identifier];
    }
    - (void)awakeFromNib
    {
    NSUserDefaults*  defaults;
    defaults = [NSUserDefaults standardUserDefaults];
    [numeroField setStringValue:([defaults stringForKey:@numero] ==nil)? NSLocalizedString(@numero,@numero):[defaults stringForKey:@numero];
    [nomsField setStringValue:([defaults stringForKey:@noms] ==nil)? NSLocalizedString(@noms,@noms):[defaults stringForKey:@noms];
    [partie1Field setStringValue:([defaults stringForKey:@partie1] ==nil)? NSLocalizedString(@partie1,@partie1):[defaults stringForKey:@partie1];
    }





    - (id)init
    {

    if (self = [super init]) {
    inscriptions = [[NSMutableArray alloc] init];
    [self createNewNumero];
    }
    return self;
    }

    @end
    Que pensez-vous de cette oeuvre majeuse ?
Cette discussion a été fermée.