[Résolu] @property

saukeguysaukeguy Membre
juin 2012 modifié dans API AppKit #1
Bonjour a tous me revoilà  donc avec de nouvelles questions:)!



Donc voici mon souci et ne me dites pas que je ne me suis pas renseigné car je navigue de forum en forum afin de comprendre le problème.



Donc voila j'ai une interface test qui est une View et dans laquelle je possède un Outlet de typer Combobox. Ce combobox comporte des éléments qui sont directement chargé via IB.



Comme ceci :


<br />
<br />
[color=#d62b24][color=#7a482f]#import [/color]&lt;Cocoa/Cocoa.h&gt;[/color]<br />
<br />
[color=#bf2e9d]@interface[/color] test : NSObject {<br />
	[color=#bf2e9d]IBOutlet[/color] [color=#7340a3]NSView[/color] *view;<br />
	[color=#bf2e9d]IBOutlet[/color] [color=#bf2e9d]id[/color] nb_mission;<br />
}<br />
<br />
[color=#bf2e9d]@property[color=#000000]([/color]assign[color=#000000]) [/color]id[color=#000000] _nb_mission;[/color][/color]<br />
<br />
- ([color=#bf2e9d]IBAction[/color])nb_mission:([color=#bf2e9d]id[/color])sender;<br />
<br />
[color=#bf2e9d]@end[/color]<br />




J'essaye donc de récupérer le contenu sélectionné dans cette combobox autre part dans un autre fichier. Je réalise donc automatiquement un getter/setter grace au @property @ synthesize.


<br />
<br />
[color=#7a482f]#import [color=#d62b24]&quot;test.h&quot;[/color][/color]<br />
[color=#bf2e9d]@implementation[color=#000000] test[/color][/color]<br />
[color=#bf2e9d]@synthesize[/color] _nb_mission = nb_mission;<br />




Jusque la tout va bien mon getter est bien reconnu dans mon autre fichier. Le seul souci est que je connais mon erreur mais je ne sait pas comment la résoudre.



Et enfin dans mon autre fichier je fait:


<br />
<br />
test *a = [[test [color=#3f217c]alloc[/color]][color=#3f217c]init[/color]];<br />
<br />
[color=#7340a3]NSAlert[/color]* msgBox = [[[[color=#7340a3]NSAlert[/color] [color=#3f217c]alloc[/color]] [color=#3f217c]init[/color]] [color=#3f217c]autorelease[/color]];<br />
[msgBox [color=#3f217c]setMessageText[/color]: [[color=#7340a3]NSString[/color] [color=#3f217c]stringWithFormat[/color]:[color=#d62b24]@&quot;%@&quot;[/color],a._nb_mission]];<br />
[color=#3f217c][color=#000000][msgBox [/color]addButtonWithTitle[color=#000000]: [/color][color=#d62b24]@&quot;OK&quot;[/color][color=#000000]];[/color][/color]<br />
[msgBox [color=#3f217c]runModal[/color]];<br />




Afin de savoir si les pointeurs sur ma combobox sont les même. Le problème est que je ne pointe pas sur le même objet test.



sachant que juste avant j'affiche ma view dans ma window ce qui normalement à  donc déja initialisé mes outlet:
<br />
<br />
[color=#7340a3]NSViewController[color=#000000] *viewController = [[[/color]NSViewController[color=#000000] [/color][color=#3f217c]alloc[/color][color=#000000]] [/color][color=#3f217c]initWithNibName[/color][color=#000000]:[/color][color=#d62b24]@&quot;test&quot;[/color][color=#000000] [/color][color=#3f217c]bundle[/color][color=#000000]:[/color][color=#bf2e9d]nil[/color][color=#000000]];[/color][/color]<br />
<br />
[view_mission_1 [color=#3f217c]addSubview[/color]:[viewController [color=#3f217c]view[/color]]];<br />


Comment pourrait-je pointer sur le même objet afin de récupérer le contenu de ma combobox autre part. je sait que mon erreur vient du fait que je créer un test et que je ne manipule donc pas la même chose mais comment faire donc?



Est-ce une manipulation a faire via IB?



Merci encore de vos futurs réponses qui m'aident toujours image/smile.png' class='bbc_emoticon' alt=':)' />.

Réponses

  • CéroceCéroce Membre, Modérateur
    mai 2012 modifié #2
    1) Par convention, le nom d'une classe commence toujours par une majuscule, et devrait donc s'appeler Test.



    2) Qu'est ce qu'est sensé être _nb_mission ?

    Là , tu l'as mis en type id.

    id est un type du langage Objective-C et qui représente un objet générique. Ce n'est pas un entier.





    Quand un nib est chargé, les objets qui sont dedans sont instanciés. Ensuite, les outlets, qui sont des pointeurs sur des objets, sont fixées pour correspondre à  ces objets.

    Il nous faudrait savoir ce que tu as mis dans le xib.
  • Oui je sait très bien mais comme l'annonce très bien cette classe ce n'est qu'un petit test et je suis d'accord pour l'id afin de savoir si cela marche mais c'est vrai que je devrais être plus rigoureux. En ce qui concerne la view, j'ai lut sur d'autre forums que celle-ci instancie bien les objets quand on la load.



    Voici ce que comporte mon xib qui comporte ma view. Une simple NSCombobox qui est relié à  mon fichier via IB.





    <br />
    [color=#bf2e9d]@synthesize[/color] nb_mission;<br />
    




    Je réitère ma question. En enlevant


    <br />
    [color=#008326]<br />
    test *a = [[test alloc]init];[/color]<br />
    




    Puis je accéder a ma variable nb_mission qui est une Combobox dans le fichier ou ma view est apellé en faisant par exemple [viewController view.nb_mission].



    Ceci n'est qu'un exemple ne prenez pas la mouche image/smile.png' class='bbc_emoticon' alt=':)' />.
  • CéroceCéroce Membre, Modérateur
    mai 2012 modifié #4
    'saukeguy' a écrit:


    Puis je accéder a ma variable nb_mission qui est une Combobox dans le fichier ou ma view est apellé en faisant par exemple [viewController view.nb_mission].








    Non, tu ne peux pas, parce que viewController est un NSViewController et sa propriété view est de type NSView*, pas Test.



    Typiquement, ce qu'on ferait:
    • Créer une classe TestViewController qui hérite de NSViewController.
    • Lui ajouter une IBOutlet NSComboBox *nbrMissionsComboBox.


    Ensuite, pour charger le XIB:
    <br />
    TestViewController *controller = [[TestViewController alloc] initWithNibName:@&quot;TestViewController&quot; bundle:nil];<br />
    




    De toute façon, c'est aux contrôleurs de faire le lien entre les vues et les modèles, pas aux modèles d'aller lire la combo box, il te faut donc un contrôleur. (architecture MVC).
  • Oui très bien j'ai compris le principe mais le fait de créer une classe qui hérite de NSViewController ne changera rien non pour l'accès a cette variable. Comme tu l'as dit plus haut un controller reste un controller et son rôle est bien définit.



    En effet, je doit absolument réaliser un contrôle sur cette outlet. Ce que je ne comprend pas c'est que le getter n'est pas accessible dans le fichier exterieur et que pour y accéder je doit obligatoirement créer une instance de cette classe qui obligatoirement remettra les IBOutlet a nil . Je ne peut pas instancier cette classe autrement pour lui dire qu'il doit se connecté au controlleur qui a chargé le xib?
  • yoannyoann Membre
    Attention, les NSViewController c'est pas le plus simple à  utiliser sur une application Mac (qui a tendance à  être un peu plus laxiste que l'iOS sur le MVC).



    Pour ton problème, pourquoi ne prendrais tu pas un projet vierge fournis par Xcode, tu met une combobox dans ta fenêtre et tu utilise l'assistant pour ajouter et déclarer correctement des IBOutlet ? Au moins tu verra quel est la bonne méthode et tu pourra la reproduire...
  • HerveHerve Membre
    Des choses comme :
    <br />
    @synthesize _nb_mission = nb_mission;<br />
    


    sont vraiment étonnantes!!

    @property et @synthesize remplacent les méthodes set et get de Java par exemple. Donc
    <br />
    [self set_nb_mission : nb_mission];<br />
    


    lors de la méthode "init" de ta classe.



    Comme dit plus haut, "id" ne renseigne sur rien... Ce n'est ni un type C ni une classe. Que veux-tu instancier? Cela produira des erreurs de mémoire nécessairement.



    Le bouquin "Cocoa sous Mac OSX" de Hillegass est vraiment très bien pour apprendre les bases...
  • CéroceCéroce Membre, Modérateur
    mai 2012 modifié #8
    Bon, je rejoins l'avis d'Hervé: achète le livre.



    En l'état, tu ne comprends pas comment fonctionne l'instanciation des objets dans le nib, comment on charge un nib et ce qu'est le File's Owner. Le livre t'expliquera les concepts petit à  petit.
  • J'aimerais remercier tous les membres du forum pour ce très bon forum. J'ai enfin compris le fonctionnement et la liaison file's owner ect.. ainsi que les différentes fuites mémoires. Dans un futur proche si j'ai le temps j'aimerais exposer un petit tuto que je réliserais moi même pour les novices en la matière comme moi-même.Merci encore
  • CéroceCéroce Membre, Modérateur
    De rien... persévère, il n'y a que comme cela qu'on apprend.
  • HerveHerve Membre
    Ouaip!! (et encore, j'ai pas tout compris!)
Connectez-vous ou Inscrivez-vous pour répondre.