Impossible de créer un Outlet dans mon .h
JazzMano
Membre
Bonjour, pour faire court, j'ai exactement le même problème que ce monsieur :
http://forum.cocoaca...teur-assistant/
Mais je ne comprend pas sa réponse.
J'ai ouvert un topique sur ce site qui explique plus en détail mon problème :
http://www.siteduzer...h.html#r7226323
Par exemple, je met dans mon mainstoryboard 3 vue dans lesquels je souhaite avoir un bouton et un label pour faire une appli type HelloWorld. Je peux lier le label de la vue 1 à mon ViewController.h mais pas le label de la vue 2 ou 3, il ne veux pas faire la connection en Outlet.
J'ai cru au début qu'il fallait faire un ViewController.h pour chaque vue mais d'un, je ne sai pas comment créer un nouveau ViewController.h et de deux, au vu du message au dessus (premier lien), ça na pas l'air d'être ça.
J'ai 3 jours de retard sur les objectifs de ma semaine à cause de ce problème et je commence à être complétement démoraliser de buter sur un truc aussi simple. Pourriez-vous m'aidez ?
Merci à vous.
http://forum.cocoaca...teur-assistant/
Mais je ne comprend pas sa réponse.
J'ai ouvert un topique sur ce site qui explique plus en détail mon problème :
http://www.siteduzer...h.html#r7226323
Par exemple, je met dans mon mainstoryboard 3 vue dans lesquels je souhaite avoir un bouton et un label pour faire une appli type HelloWorld. Je peux lier le label de la vue 1 à mon ViewController.h mais pas le label de la vue 2 ou 3, il ne veux pas faire la connection en Outlet.
J'ai cru au début qu'il fallait faire un ViewController.h pour chaque vue mais d'un, je ne sai pas comment créer un nouveau ViewController.h et de deux, au vu du message au dessus (premier lien), ça na pas l'air d'être ça.
J'ai 3 jours de retard sur les objectifs de ma semaine à cause de ce problème et je commence à être complétement démoraliser de buter sur un truc aussi simple. Pourriez-vous m'aidez ?
Merci à vous.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Parfois le .h que IB te montre n'est pas le bon... il faut basculer de Manual à Automatique dans certains cas...
Je viens de regarder ton second lien où tu explique par l'image ton problème, et je pense que tu t'y prends mal pour ton QCM (je demande l'indulgence des maà®tres de ce lieu, si ce que je dis est faux...).
Solution 1 : Pour faire la même chose, j'utiliserais une ViewController unique, avec laquelle j'afficherais à la volée par code la question et les 4 réponses. Soit quelques labels et 4 boutons (avec leur actions) à placer. Avantage : tu peux jouer sur le nombre de réponses etc
Solution 2 : Je crée comme toi un ViewController dans IB, je place mon titre et mes 4 réponses. Et ton bouton Suivant, ne ferait que rafraichir la même view en lui passant le tableau des données (NSArray qui contient titre, réponses) et le numéro de la question courante...
Suis pas sûr d'avoir été clair !
1. Qu'est-ce que le Manual et Automatique ? A quoi fais-tu référence ?
2.Dans ta solution 1, j'ai 10 quesions en tout, du coup je ne vois pas comment les mettres toutes avec leurs réponses et annexes à chacune.
3. Ta solution 2 serait parfaite pour moi mais est-ce facile à faire ? Je doit sortir mon appli vendredi pour te donner mon planning. Si oui, est-ce que tu as un exemple ou un tuto quelque part ?
4. Je vois le terme IB de plus en plus souvent, c'est quoi ?
Merci beaucoup pour t'es réponses, je m'y prend surement très mal pour faire mon QCM mais je n'ai pas vu d'autre moyen avec le peut de conaissance que j'ai sur xcode. J'était pas loin d'abandonner aujourd-hui...
Je me renseigne sur ce qu'est le NSAray en attendant ta réponse, merci encore.
Il te suffira alors de charger celui-ci dans un NSDictionary et de jouer avec celui-ci.
Sinon, je te conseillerai, si tu maà®trise pas storyboard, de te lancer dans un projet sans storyboard ^^.
(Tu auras un XIB par UIViewController)
1. Dans ta deuxième image, tu as ta fenêtre divisée en 2 écrans, dont celle de droite corresponds au .h. Au dessus, dans la barre de statut de l'éditeur du .h il est écrit : MANUAL > ViewController > No Selection.
C'est ce MANUAL là dont je te parlais, parfois le .h montré n'est pas celui de l'éditeur IB... tu clic sur Manual et tu choisis Automatique
2. J'ai pas d'exemple et si tu vois pas comment marche un NSArray j'ai quelques doutes pour vendredi !
3. IB = Interface Builder... c'est l'outil de la partie gauche de ton écran (sur ta copie écran), l'éditeur de design en gros...
C'est une méthode pour garder le moral dans un projet et toujours aller de l'avant. Au pire j'essaye de terminer l'appli aujourd'hui en laissant le schéma actuelle, au mieu d'ici vendredi j'aurais eu le temps de faire ce que vous me proposez avec le NSarray et NSDictionary. Merci encore pour votre aide et bonne journée !
Ce que je fais ci-dessous n'est ni pédagogique ni productif pour toi (ni pour moi !), mais bon je suis de bonne humeur cette aprem, il fait beau....
Dans IB :
Tu crée tous les labels et les 4 boutons + le bouton next
Tu fais pointer next vers l'action : nextButton
Et tu fais pointer les 4 bouton sur la même action : repAction
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (nonatomic, retain) NSMutableArray *qcm;
@property (nonatomic) NSInteger currentQuestion;
@property (retain, nonatomic) IBOutlet UILabel *titreLabel;
@property (retain, nonatomic) IBOutlet UILabel *q1Label;
@property (retain, nonatomic) IBOutlet UILabel *q2label;
@property (retain, nonatomic) IBOutlet UILabel *q3Label;
@property (retain, nonatomic) IBOutlet UILabel *q4label;
- (IBAction)repAction:(id)sender;
- (IBAction)nextButton:(id)sender;
@end
Dans le ViewController.h
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize titreLabel;
@synthesize q1Label;
@synthesize q2label;
@synthesize q3Label;
@synthesize q4label;
@synthesize qcm, currentQuestion;
- (void)viewDidLoad
{
/color][color=#385789]super[/color][color=#000000] [/color]viewDidLoad[color=#000000;
// Do any additional setup after loading the view, typically from a nib.
qcm = /color]NSMutableArray[color=#000000] [/color][color=#5a80a7]new[/color][color=#000000;
[qcm addObject : [NSMutableDictionary dictionaryWithObjectsAndKeys:
@Titre question 1, @titre,
/color][color=#c05710]NSNumber[/color][color=#000000] [/color][color=#5a80a7]numberWithInt[/color][color=#000000]:[/color][color=#385789]1[/color][color=#000000,@bonnereponse,
[NSArray arrayWithObjects:@rep10,@rep11,@rep12,@rep13,nil], @reponses,
nil
]];
[qcm addObject : [NSMutableDictionary dictionaryWithObjectsAndKeys:
@Titre question 2, @titre,
/color][color=#c05710]NSNumber[/color][color=#000000] [/color][color=#5a80a7]numberWithInt[/color][color=#000000]:[/color][color=#385789]0[/color][color=#000000,@bonnereponse,
[NSArray arrayWithObjects:@rep20,@rep21,@rep22,@rep23,nil], @reponses,
nil
]];
currentQuestion = 0;
NSLog(@%@qcm", qcm);
}
- (void)viewWillAppear:(BOOL)animated {
/color][color=#385789]self[/color][color=#000000] [/color]affichage[color=#000000;
}
- (void) affichage {
titreLabel.text = [/color]qcm[color=#000000] [/color]objectAtIndex[color=#000000]:[/color]currentQuestion[color=#000000 valueForKey:@titre];
for(int i=0; i<[[/color]qcm[color=#000000] [/color]objectAtIndex[color=#000000]:[/color]currentQuestion[color=#000000 valueForKey:@reponses] count]; i++) {
UILabel *monLabel = (UILabel *)color=#385789]self[/color].[color=#5a80a7]view[/color] [color=#5a80a7]viewWithTag[/color]:i+[color=#385789]100[/color;
monLabel.text = [[/color]qcm[color=#000000] [/color]objectAtIndex[color=#000000]:[/color]currentQuestion[color=#000000 valueForKey:@reponses] objectAtIndex:i] ;
}
}
- (void)viewDidUnload
{
/color]self[color=#000000] [/color][color=#5a80a7]setQcm[/color][color=#000000]:[/color]nil[color=#000000;
/color][color=#385789]self[/color][color=#000000] [/color]setTitreLabel[color=#000000]:[/color][color=#385789]nil[/color][color=#000000;
/color][color=#385789]self[/color][color=#000000] [/color]setQ1Label[color=#000000]:[/color][color=#385789]nil[/color][color=#000000;
/color][color=#385789]self[/color][color=#000000] [/color]setQ2label[color=#000000]:[/color][color=#385789]nil[/color][color=#000000;
/color][color=#385789]self[/color][color=#000000] [/color]setQ3Label[color=#000000]:[/color][color=#385789]nil[/color][color=#000000;
/color][color=#385789]self[/color][color=#000000] [/color]setQ4label[color=#000000]:[/color][color=#385789]nil[/color][color=#000000;
/color][color=#385789]super[/color][color=#000000] [/color]viewDidUnload[color=#000000;
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
- (IBAction)repAction:(id)sender {
UIButton *monBouton = (UIButton*) sender;
if(monBouton.tag == [[/color]qcm[color=#000000] [/color]objectAtIndex[color=#000000]:[/color]currentQuestion[color=#000000 valueForKey:@bonnereponse] intValue]+200) {
// ici pour action sur bonne réponse
NSLog(@bonne reponse);
} else {
// ici pour action sur mauvaise réponse
NSLog(@ko);
}
}
- (IBAction)nextButton:(id)sender {
currentQuestion += 1;
if(currentQuestion >= /color]qcm[color=#000000] [/color]count[color=#000000) currentQuestion -=1;
/color][color=#385789]self[/color][color=#000000] [/color]affichage[color=#000000;
}
- (void)dealloc {
/color]qcm[color=#000000] [/color]release[color=#000000;
/color]titreLabel[color=#000000] [/color]release[color=#000000;
/color]q1Label[color=#000000] [/color]release[color=#000000;
/color]q2label[color=#000000] [/color]release[color=#000000;
/color]q3Label[color=#000000] [/color]release[color=#000000;
/color]q4label[color=#000000] [/color]release[color=#000000;
/color][color=#385789]super[/color][color=#000000] [/color]dealloc[color=#000000;
}
@end
@Kixxx : à raison sur tous les points qu'il évoque et tu devrais modifier mon code en conséquence pour ta prochaine...
J'ai fais au plus simple et suis passé par IB pour poser les boutons réponses et label, car je sens que tu es plus à l'aise avec, mais l'idéal est de le faire dans le code, en dessinant tes objets directement... mais bon je pense que tu as encore quelques trucs à voir avant !
Merci beaucoup pour ton code je l'analyse et ce soir je vous dirai si je peux me débrouiller sans aide supplémentaire. Profitez du beau temps et merci encore.
Tu remarquera les +100 et +200 dans mon code... c'est la numérotation des tags de mes view dans IB. Etant donné que j'ai 4 réponses, le label de la réponse a pour tag 100 (dans IB la fenêtre de propriétés à droite, View -> Tag), pour la réponse 2, c'est 101 etc
idem pour les bouton des réponse, le UIButton de la réponse 1, c'est 200, puis 201 etc
bon j'ai écris ton code ligne par ligne pour essayer de le comprendre, j'ai compris la plupart des lignes par deduction pour le reste je verrais ça à tête reposé.
Par contre je me retouve avec 10 erreurs rouge sur le -(void)deadalloc à cause du "release"
C'est les deux mêmes erreurs sur chaque lignes sauf pour " [titreLabel release]; " et " [q4Label release]; " ce qui est bizarre :
1. ARC forbids explicit message send of "release"
2."release" is unavailable: not available in automatic reference counting mode
EDIT 1: Résolu, il suffit de désactiver Objective C automatic Reference Counting dans build setting.
EDIT 2 : arf, 6 fois la même erreurs dans @synthesize :
Erreur : 1.@synthesize of "weak" property is only allowed in ARC or GC mode
Cette erreur apparait quand je résout mon premier EDIT, c'est l'Objective C automatic Reference Counting sur OFF qui me fait ça.
Du coup la question, c'est quoi ARC ?
EDIT 4: résolu, j'ai laisser ARC gérer la mémoire en supprimant -(void)dealloc et j'ai remis mon l'OARC sur On.
Enfin, même si c'est un truc bête, rien ne t'interdit de dire ce que tu as fait pour que çà fonctionne, çà pourra aider un autre débutant qui fera l'effort de faire une recherche sur Google s'il a le même problème...
Amicalement /kiss.gif' class='bbc_emoticon' alt=':-*' />
Comme tu la dis, je ne me suis pas contenté de poser ma question et puis d'attendre, au contraire. Bon, après, si tu ne la pas vue, c'est que ce n'est pas très visible, du coup je vais mettre un peux de couleur dans tout ça.
Bonne journée.
EDIT : Par contre si tu parle de mon tout premier poste ou je demande de l'aide, oui j'ai fais des recherches pendant plusieurs jours sans succés car c'est difficile quand on ne sait pas précisément ce que l'on cherche et les mots clés à utiliser, la preuve, apparament je m'y prennai très mal en faisant 10 vues pour 10 questions. Si j'ai poster ici, c'est que j'avais déjà entrepris toute les démarches en mon pouvoir (et aussi par manque de temps) mais il y'à un moment ou l'on à tous besoin d'un professeur pour avancer.
C'est parce que la classe de mon File's Owner (dans la barre en dessous de la vue, le rond jaune à coter du carré First Responder) était un UIViewController alors que ce devrait être un ViewController.
Pour changer le nom de la classe, il faut aller (dans IB) à droite dans les options "show the identify inspector" et changer le nom de la classe.
C'est ça qui ma fait perdre 3 jours de travail, c'est à ce taper la tête contre le mur.
On fait l'erreur une fois, et après on a compris (m'enfin 3 jours pour ça...). Si on n'a pas compris avant en allant lire la doc.
Oui l'appli tel que tu me la donné ( le -(void)dealloc en moins car il me cause une erreur de type ARC) fonctionne bien dans le simu, maintenant je dois comprendre comment faire pour que :
1. comment sélectionner la bonne réponse (A par ex)
Actuellement si je clique sur A,B,C ou D ça passe au titre 2 quand même. Je me penche sur ça là , ça doit pas être bien compliqué.
2. Comment afficher un "bravo !" + mon annexe au titre une fois la bonne réponse cliqué.
Ca, je crois savoir faire, avec un NSString et cà¦tera.
3. Ecrire un .plist et en suite le charger dans mon projet puis l'appeller avec un code.
Même chose ici, je crois avoir trouvé, add file --> ressource--> property list et écrire dedans, par contre pour l'appeller dans mon code je n'ai pas d'idée pour l'instant mais j'ai mis quelques sites en favorie ayant rapport à ça.
4.Trouver la méthode la plus rapide pour écrire mes 642 questions dans un fichier .plist et les incorporées à mon code.
5.Trouver des explications sur la base de donnée de l'iphone.
(j'ai pas bien compris si c'était du SQLite SQL ou autre chose)
D'autres points viendront surement après plus divers truc théorique que je n'ai pas encore assimilé, donc j'aurais quelques questions pour vous demain si vous le voulez bien. Voilà , encore merci pour ton code Kamalus et bonne soirée.
- (IBAction)repAction:(id)sender
Car c'est lui qui gère la bonne réponse pour la question courante. La bonne réponse pour chaque question est dans le array :
/color][color=#C05710]NSNumber[/color][color=#000000] [/color][color=#5A80A7]numberWithInt[/color][color=#000000]:[/color][color=#385789]0[/color][color=#000000,@bonnereponse... c'est le chiffre 0 ici qui dit que c'est la première réponse qui est la bonne, 1 pour la deuxième etc
En fait tu dois faire un cinquième bouton que tu appel "suivant" par exemple et qui pointe vers :
- (IBAction)nextButton:(id)sender
pour passer à a question suivante.
2. tu rajoute un label dans IB que tu relis dans ton .h et que tu nomme par exemple msgLabel dans le quel tu écris ton message. Ensuite ton action doit devenir :
- (IBAction)repAction:(id)sender {
UIButton *monBouton = (UIButton*) sender;
if(monBouton.tag == [[/color]qcm[color=#000000] [/color]objectAtIndex[color=#000000]:[/color]currentQuestion[color=#000000 valueForKey:@bonnereponse] intValue]+200) {
// ici pour action sur bonne réponse
NSLog(@bonne reponse);
msgLabel.hidden = NO;
} else {
// ici pour action sur mauvaise réponse
NSLog(@ko);
​msgLabel.hidden = YES;
}
Remarque : pour faire afficher le document lié à la bonne réponse, tu dois ajouter une entrée dans ton array qui donne le nom du fichier (l'url, le doc ou ce que tu veux) et tu l'ouvre dans une autre ViewController...
Pour le msgLabel, j'ai fait comme tu me la indiqué mais le problème c'est que le message "bravo !" apparait dès le lancement du programme mais disparait une fois que l'on à cliqué sur une mauvaise réponse et réapparait une fois la bonne réponse choisie.
J'ai essayé de faire ça :
Mais ça fait la même chose.
Tiens, je te met une image de l'app que je veux faire, tu comprendras mieux je pense :
Déjà , comme lui j'arrive à avoir le bouton back mais pas le bouton Next, pourtant il me semble que c'est bien un boutton de base d'iphone, non ?
La "référence : PMPBOK Guide 4th edition, page 423", c'est ce que j'appelle mon annexe, c'est le label qui apparait quand la bonne réponse est séléctionnée.
Lui il n'a pas de "Bravo !" ou de "bonne réponse" qui s'affiche mais simplement le bouton qui passe en rouge si la mauvaise réponse est cliqué et en suite en vert est affiché la bonne réponse.
Dans l'idéal, j'aimerais avoir la même chose mais si j'ai trouvé comment changer la couleur d'un texte dans un label, je n'ai pas trouvé pour changer la couleur d'un bouton, c'est indiqué nulle part et je n'ai pas l'impression que ce soit une image avec un fond vert qu'il utilise, si ?
2. Dans la fonction -(void)affichage tu met : msgLabel.hidden = YES, comme ça le message ("bravo" ou autre) est caché à chaque chargement de question. Et tu supprime ton blabla du bravo dans l'action du bouton et tu écrit ton texte "bravo" dans IB (pour le UILabel)
3. Pour changer la couleur du label tu fais du genre :
nomdulabel.color = [UIColor redColor]; // couleur du texte
nomduLabel.backgroundColor = [UIColor blueColor]; // couleur du fond
4. Pour ton annexe, tu rajoute une entrée dans ton array :
Tu rajoute dans IB un autre UILabel (comme pour "bravo"), par exemple annexeLabel.
Tu cache le label comme pour bravo dans la fonctionna affichage.
Tu modifie ton action du genre :