Push d'un navigateur sur clic UIImageView
Bonjour,
je suis nouveau en programmation Objective-C et je dois faire une boucle où je crée à chaque fois une nouvelle instance de ma classe et je butte sur le nom de cette instance. Si je met un nom comme maVar, bien évidemment je crée toujours le même objet donc en fin de compte j'en ai qu'un seul.
Je voudrais alors faire comme je fait d'habitude avec d'autres langages, c'est à dire concatener par exemple un nom de var fixé avec un entier du genre :
premier tour de boucle : maVar1
deuxieme tout de boucle : maVar2
...
J'ai bien un NSString qui contient ce nom mais je ne sais pas comment le passer en tant que nom de variable :
J'ai essayé ça : (MaClasse *)[monString] mais ca ne marche pas.
Quelqu'un pourrait il m'aider ?
merci d'avance
je suis nouveau en programmation Objective-C et je dois faire une boucle où je crée à chaque fois une nouvelle instance de ma classe et je butte sur le nom de cette instance. Si je met un nom comme maVar, bien évidemment je crée toujours le même objet donc en fin de compte j'en ai qu'un seul.
Je voudrais alors faire comme je fait d'habitude avec d'autres langages, c'est à dire concatener par exemple un nom de var fixé avec un entier du genre :
premier tour de boucle : maVar1
deuxieme tout de boucle : maVar2
...
J'ai bien un NSString qui contient ce nom mais je ne sais pas comment le passer en tant que nom de variable :
J'ai essayé ça : (MaClasse *)[monString] mais ca ne marche pas.
Quelqu'un pourrait il m'aider ?
merci d'avance
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Si tu fais une boucle avec une variable déclarée en interne, la portée de cette variable est limitée à la boucle :
permet de créer effectivement 10 NSString différentes .
cela répond-il à ta question ?
voici mon code :
le problème vient du fait que si je garde le même nom pour mon instance de classe, il efface les précédentes et en fin de compte je me retrouve avec une seule instance, la dernière.
Ceci vient du fait que chaque vue doit exister afin d'être affichée et que du coup elle persiste(retain).
Bref je pensais qu'en faisant comme par exemple maVar + i pour le nom de ma variable ca passerait. Un peu comme en javascript.
Si ce n'est pas possible comment faire pour avoir des noms de variables différents à chaque tour de boucle.
J'avais pensé à un tableau mais ca revient un peu au meme je ne sais pas comment donner le contenu de mon tableau au nom de ma variable
merci
Tu fais un NSMutableArray viewControllers contenant ces UIViewController.
et tu les appelles ensuite
et ce que tu voudrais appeler viewControllers_8 est appelé par
   [viewControllers objectAtIndex: 8];
Encore une fois il y a une solution par les macros, mais ce n'est pas ce qui se fait traditionnellement.
je sais vraiment pas comment faire... c'est si simple dans d'autres langages
Fais simplement
[ .... addSubview:[[viewControllers objectAtIndex:i] view] ]
ou plus proprement au niveau lecture du code :
currentViewController=[viewControllers objectAtIndex:i];
[ .... addSubview: currentViewController.view ]
Pour corriger le code de Philippe qui a fait un petit oubli:
si j'ai bien compris mon ajout de controlleurs doit alors se faire en dehors de la boucle ?
Non
et si après tu as besoin de manipuler de nouveau tes vues ou contrôleurs, tu les atteints par [viewControllers objectAtIndex:i]
La je n'est plus d'erreur ni de plantage par contre plus rien ne s'affiche alors que si je fais le meme code en dehors de la boucle avec à la place de i par exemple 1 cela m'affiche une instance de ma classe....
Comment est créée la vue dans la classe MyTag ?
Comme " Cocoa par la Pratique " de Hillegass par exemple...
Bref ma vue est comme ceci
le .h :
et son implémentation
M'enfin bon, là manifestement tu n'as de pas grandes références sur le dev iPhone et sur l'obj-C ... et le conseil de Schlum est du pur bon sens : Il est difficile d'aborder Obj-C/Cocoa/Cocoa Touch uniquement avec des tutos ou des références sur le web comme on peut le faire pour le CÂ ou d'autres langages très répandus.
Pour utiliser viewDidLoad il faut un xib associé, "MyTag.xib" par exemple, et la création se fait alors par
[[MyTag alloc] initWithNibName:@MyTag bundle:nil]
Dans ma méthode viewDidLoad () je fais donc les init nécessaires à ma classe mais je ne vois pas pourquoi j'ai besoin de faire un initWithNibName puisque dans Interface Builder j'ai dit que ma classe est associée avec le nib MyTag.xib
Mon probleme viendrait il de la ? Est ce que je dois donc effacer le lien dans IB et utiliser la méthode iniWithNibName ?
merci encode de votre aide
Cela ne peut pas marcher ainsi.
je n'ai pas non plus de IBOutlet
1) Fait un clic droit sur les resources, add>new file et choisis view.xib dans les propositions.
2) Double-clic sur ce xib
3) Sélectionne File's Owner, et dans le panel Identity de IB (le dernier) indique la class MyTag dans le champ Class Identity
4) Clic droit sur File's Owner, et tire une ligne de l'IBOutlet view à la vue proprement dite : cela dit que la vue du File's owner, en l'occurence un view controller Mytag est configurée comme l'est cette vue.
Cocoa / Objective-C, ne n'est pas qu'un langage de programmation, c'est une API basée sur des design patterns assez spécifiques qu'il faut connaà®tre... En gros c'est presque une philosophie. Elle est difficile à appréhender " comme ça ".
Le livre que je t'ai proposé est une référence du genre.
En tout cas, ça on peut faire la même chose avec un NSMutableDictionary
Mais l'indirection est une très mauvaise pratique de programmation.
[[MyTag alloc] initWithNibName:@MyTag bundle:nil] 8--)
j'ai lu que des livres américains comme "Beginning iPhone Development", "The iPhone Developper's cookbook" et "Programming in Objective C 2.0" et ils m'ont aidé car je suis vraiment nouveau dans la programmation mac, je ne suis qu'étudiant après tout et je suis beaucoup plus calé en prog web qu'en C ou Java, du coup c'est vraiment tout nouveau pour moi et comme la je suis en stage justement pour développer une appli iPhone j'ai du m'y mettre.
Bref tout ça pour dire que je galère un peu mais qu'au fur et à mesure cava un peu mieux notamment grâce à vos conseils.
Donc si quelqu'un a une idée du pourquoi je ne peut pas afficher plusieurs instances de ma fameuse vue ou alors une autre solution je vous en remercie
Pas mal de développeurs ici l'ont lu pour commencer dans le Cocoa et font des applications complexes sans problème
(mais promis, j'ai pas d'actions chez l'éditeur ;D)
je n'en doute pas :kicking:
je vais voir si je peut me le procurer mais pour le moment je dois tout de même essayer de résoudre mon problème car le temps tourne.. :-\\
ça c'est si on veut charger plusieurs fois le .xib
Si on veut mettre plusieurs fois une vue dans une autre vue, c'est plus facile, il suffit d'allouer/initialiser la vue, de setter son frame et son bounds et d'utiliser "addSubview"