comment modifier le nom d'un contrôle sous xcode 4.6.3

jcezanna54

Membre actif
3 Septembre 2005
458
35
73
Bonjour,

Si après avoir créé mon interface, je crée les liens vers le fichier viewController.h, il m'est demandé un nom pour le contrôle.
Une fois cela fait, il y a aussi du code généré dans viewController.m.

Si je modifie le nom dans viewController.[hm], j'ai des erreurs quand je compile.
Voici les codes source :
Bloc de code:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
{
    int nombreChoisi;
}
@property (weak, nonatomic) IBOutlet UITextField *saisie;
@property (weak, nonatomic) IBOutlet UITextView *resultats;
- (IBAction)autrenombre:(id)sender;
- (IBAction)saisieReturn :(id)sender;
@end

Les erreurs apparaissent au niveau de chaque ligne où apparaissent saisie et resultats dans la fonction suivante du fichier viewController.m.
Je met en gras les références qui posent problème :
Bloc de code:
-(IBAction)saisieReturn:(id)sender
{
    [sender resignFirstResponder];
    int bienPlace = 0;
    int charIndex; //Index de boucle pour parcourir tous les caractères des chaînes à comparer
    unichar testChar1, testChar2; //Les caractères à comparer : testChar1 dans le nombre proposé, testChar2 dans le nombre à trouver
    for (charIndex = 0; charIndex < 4; charIndex++)
    {
        testChar1 = [[B]saisie[/B].text characterAtIndex:charIndex];
        testChar2 = [[NSString stringWithFormat:@"%d", nombreChoisi] characterAtIndex:charIndex];
        if (testChar1 == testChar2)
            bienPlace++;
    }
    [B]resultats[/B].text = [NSString stringWithFormat:@"%@%@%d%@%@", [B]saisie[/B].text, @" : Bien placés : ", bienPlace, @"\r", [B]resultats[/B].text];
    if (bienPlace == 4)
        [B]resultats[/B].text = [NSString stringWithFormat:@"%@%d", @"Bravo, le résultat était ", nombreChoisi];

}
@end

Ceci est extrait du TP "mastermind" d'un tuto du site du zero.....
Quelqu'un peut-il m'aider ?


PS:
le tuto se nomme
"Créez des applications pour iPhone, iPad et iPod Touch"
à l'adresse :
http://www.siteduzero.com/informati...s-applications-pour-iphone-ipad-et-ipod-touch
 
Dernière édition:
C'est pas vraiment propre de déclarer des properties sans les associer à des ivars, sinon pour ton problème il te manque certainement les @synthesize dans le .m.

Dans ton .m, tu devrais essayer d'ajouter en dessous de la ligne #implementation ViewController

@synthesize saisie;
@synthesize resultats;

Mais honnêtement méfie-toi de ces tutos, là rien que sur la quizaine de lignes que tu as copiées y a des trucs qui me choquent :

- Ton UIViewController s'appelle tout bêtement ViewController, c'est pas dramatique mais perso c'est le genre de trucs que je ne fais même pas pour des projets de tests avec un ou deux contrôleurs, quitte à les appeler "MainViewController" ou un truc générique comme ça.

- Les noms de variables et méthodes en français, avec un "charIndex" en anglais qui se balade au milieu pour ajouter à la confusion, c'est le mal ; par convention, toujours tout nommer en anglais.

- Les noms des objets et méthodes sont incorrects, là tu te retrouves avec un UITextField qui s'appelle "saisie" et une UITextView qui s'appelle "resultats", de fait quand tu te retrouves à manipuler ces objets dans ton code, tu peux facilement oublier leur type. Ça coûte pas grand chose de renommer "saisie" en "inputTextField" et "resultats" en "resultsTextView", de cette façon tu risqueras pas d'oublier leur type. De la même façon, la méthode "autrenombre:" (sûrement appelée lorsque tu appuies sur un UIButton ?) ne veut rien dire comme IBAction ; pour ce genre de méthodes, on utilise un nom qui désigne l'action effectuée sur un contrôle, pourquoi pas "newNumberButtonPushedWithSender:".

- Enfin les properties déclarées à l'arrache sans objets qui vont bien dans le header, c'est une très mauvaise pratique.
Normalement, ça se déclare plutôt comme ça :

Bloc de code:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
{
    UITextField *_inputTextField;
    UITextView *_resultsTextView;
}

@property (weak, nonatomic) IBOutlet UITextField *inputTextField;
@property (weak, nonatomic) IBOutlet UITextView *resultsTextView;

@end

Bloc de code:
@implementation ViewController

@synthesize inputTextField = _inputTextField;
@synthesize resultsTextView = _resultsTextView;
 
Dernière édition:
Bonjour,
@Rez2a

Du haut de ma retraite et du bas de mes 40 années d'informatique, je suis pleinement d'accord avec tous les conseils que tu as donnés.
J'ai des macs depuis 10 ans mais pas pour du développement (ou alors du script shell, perl, php, ..)
C'est mon premier contact avec ObjC et cocoa.
Alors je reprenais simplement le code de l'exemple.

j'ai appris que ce tuto était fait pour une version antérieure de xcode (la 4.2). Depuis j'en ai pris un autre.
D'ailleurs à ce sujet si tu as un conseil à donner pour une bonne lecture, je suis preneur

Encore merci pour ta réponse.
 
@jcezanna54,

du bas de mes 27 ans, je pense avoir du mal à vous apprendre quoi que ce soit :rose:

Côté programmation, malheureusement je ne peux pas vous orienter vers tel ou tel tutoriel sur le web (à mon sens, ils seront tous incomplets, et c'est subjectif, mais même la documentation d'Apple est bourrée de mauvais exemples en ce qui concerne le développement sur iOS), mais je ne peux que vous conseiller les bouquins d'Aaron Hillegass, qui sont de très bon conseil en plus d'être assez accessibles.

Après, le gros du boulot vient de la pratique. À titre personnel, je n'ai plus lu un seul bouquin entre le moment où j'ai commencé le développement iOS (en 2010) et maintenant, donc je ne serai pas en mesure de vous aiguiller vers une bonne documentation à l'heure actuelle (d'autant plus que le SDK d'iOS bouge très vite ; la gestion de la mémoire était essentielle au moment où je m'y suis mis, alors qu'on pourrait presque considérer qu'elle est optionnelle aujourd'hui).

Je peux juste vous conseiller de vous tourner en priorité vers les concepts de programmation orientée objet (si on peut reconnaître un avantage à Cocoa, c'est bien de forcer à respecter les principes de la programmation objet), vers les docs d'Apple qui concernent les best practices au niveau du design des applis et des conventions du langage (mais encore une fois, les exemples de projets d'Apple sont blindés de mauvaises pratiques), puis vers les livres assez spécialisés d'Aaron Hillegass, qui ne s'adressent pas vraiment aux débutants en programmation objet. Vous y verrez vraiment plus clair en possédant les notions de base, et ces bouquins sont vraiment de qualité !

PS : que le tuto ait été écrit à l'époque de Xcode 4.2 ou pas, le code reste le même, et il est vraiment moyen pour pas cracher dessus :) N'hésitez pas à revenir vers cette section du forum en cas de doute sur tel ou tel tuto, je pense pas qu'on soit très nombreux, mais on sera heureux de vous ré-aiguiller si on considère que vous faites fausse route !
 
Dernière édition:
Pour debroussailler le terrain du developpement OSX: le bouquin d'Aaron Hilgass, 3eme edition. Date d'Xcode 3 mais la methodologie est excellente et permet vraiment d'apprendre a programmer.

Developpement iOS: je ne sais pas.

Utilisation de Core Data pour la programmation de base de donnees: les bouquins de Marcus Zarra.

Enfin, la doc Apple qui donne, de maniere tres abstraite donc assez indigeste pour le debutant, mais exhaustive, toutes les classes et les methodes d'Objective-C.

Pour des exemples de bonnes pratiques de programmation, se referer aux sessions video des WWDC, telechargeables via iTunes mais en y accedant par le site dev d'Apple lorsqu'on est enregistre. C'est une mine d'or. Et les exemples sont bien meilleurs que les exemples ou "sample codes" telechargeables du site dev (je rejoins ici Rez2a).
 
C'est pas vraiment propre de déclarer des properties sans les associer à des ivars, sinon pour ton problème il te manque certainement les @synthesize dans le .m.

Dans ton .m, tu devrais essayer d'ajouter en dessous de la ligne #implementation ViewController

@synthesize saisie;
@synthesize resultats;

Mais honnêtement méfie-toi de ces tutos, là rien que sur la quizaine de lignes que tu as copiées y a des trucs qui me choquent :

- Ton UIViewController s'appelle tout bêtement ViewController, c'est pas dramatique mais perso c'est le genre de trucs que je ne fais même pas pour des projets de tests avec un ou deux contrôleurs, quitte à les appeler "MainViewController" ou un truc générique comme ça.

- Les noms de variables et méthodes en français, avec un "charIndex" en anglais qui se balade au milieu pour ajouter à la confusion, c'est le mal ; par convention, toujours tout nommer en anglais.

- Les noms des objets et méthodes sont incorrects, là tu te retrouves avec un UITextField qui s'appelle "saisie" et une UITextView qui s'appelle "resultats", de fait quand tu te retrouves à manipuler ces objets dans ton code, tu peux facilement oublier leur type. Ça coûte pas grand chose de renommer "saisie" en "inputTextField" et "resultats" en "resultsTextView", de cette façon tu risqueras pas d'oublier leur type. De la même façon, la méthode "autrenombre:" (sûrement appelée lorsque tu appuies sur un UIButton ?) ne veut rien dire comme IBAction ; pour ce genre de méthodes, on utilise un nom qui désigne l'action effectuée sur un contrôle, pourquoi pas "newNumberButtonPushedWithSender:".

- Enfin les properties déclarées à l'arrache sans objets qui vont bien dans le header, c'est une très mauvaise pratique.
Normalement, ça se déclare plutôt comme ça :

Bloc de code:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
{
    UITextField *_inputTextField;
    UITextView *_resultsTextView;
}

@property (weak, nonatomic) IBOutlet UITextField *inputTextField;
@property (weak, nonatomic) IBOutlet UITextView *resultsTextView;

@end

Bloc de code:
@implementation ViewController

@synthesize inputTextField = _inputTextField;
@synthesize resultsTextView = _resultsTextView;

Salut,

En essayant ton code , dans mon file.m , il m'oblige à mettre _nomVariable plutôt que nomVariable.

Ne faudrait-il pas tout simplement mettre nomVariable au lieu de _nomVariable dans @interface { ... }

Pourquoi ? Aussi , pourquoi ce _ devant ?
 
Bonjour,

@reza et lio :
J'étais aussi tombé sur ce même auteur mai simplement parce que ses livres étaient les plus récents. Il y a aussi le fait qu'il y a 2 livres, un pour ObjC et l'autre pour le graphisme.
Grâce à vous, je ne me pose plus de question...

@Bloupies:
je ne peux malheureusement plus refaire le test car j'ai mis le projet à la poubelle.
Mais pour un vieux programmeur unix comme moi, l'usage de underscore en tête de variable n'est pas conseillé car réservé aux noms de variable noyau et driver. En tout les cas indiquant des noms cachés au programmeur applicatif et qu'il ne devait pas utiliser. Ainsi exit(int) doit avoir une correspondance _exit(int) mais c'est la première qui doit être utilisée.

Merci à tous
 
Enfin, la doc Apple qui donne, de maniere tres abstraite donc assez indigeste pour le debutant, mais exhaustive, toutes les classes et les methodes d'Objective-C.
Oui sur le fait qu'elle est indigeste pour le débutant. Mais une fois qu'on a un peu d'expérience, elle est souvent plus que suffisante..
Par contre, non, elle n'est pas toujours des plus complètes. J'bosse avec CoreBluetooth.framework, et on en resté à une version pas à jour (.h commenté, mais pas de doc, ce qui est un peu gênant parfois)...
 
@Bloupies:
je ne peux malheureusement plus refaire le test car j'ai mis le projet à la poubelle.
Mais pour un vieux programmeur unix comme moi, l'usage de underscore en tête de variable n'est pas conseillé car réservé aux noms de variable noyau et driver. En tout les cas indiquant des noms cachés au programmeur applicatif et qu'il ne devait pas utiliser. Ainsi exit(int) doit avoir une correspondance _exit(int) mais c'est la première qui doit être utilisée.

Merci à tous

En fait par convention, on préfixe les variables d'instance par un underscore, et on utilise le même nom non préfixé par un underscore pour définir le nom de la property associée.
Dans le code que j'avais fait au-dessus, ça fait que tu peux accéder au textfield via _inputTextField ou self.inputTextField depuis le code du fichier d'implémentation. Théoriquement, pas de conflit possible avec les noms de variables d'Apple puisqu'il me semble qu'ils les préfixent de deux underscores à la suite.

Pour un peu plus de détails, préfixer les variables d'instance par un underscore, ça permet surtout d'identifier d'un coup d'oeil que ce sont des variables d'instance tout bêtement. Si on nomme toutes les variables de la même façon sans underscore, c'est difficile de dire, juste en regardant le fichier d'implémentation, si elles peuvent être vues dans tout le fichier ou seulement dans la méthode dans laquelle elles sont déclarées.

Bon après, si Xcode s'occupe tout seul de déclarer les ivars et de faire les synthesize, j'imagine que c'est plus la peine de se casser la tête avec ça, faut dire que j'ai du mal à perdre certaines habitudes :) (et j'ai surtout horreur de déclarer des properties à tout bout de champ et à y accéder par des self.xxx dans tout le code)