Programmation Cocoa sous MacOsX 3ème édition en Français est sorti

2»

Réponses

  • schlumschlum Membre
    20:32 modifié #32
    id _toto -> pas reconnu
    id toto -> reconnu
    IBOutlet id _toto -> reconnu
  • GercofisGercofis Membre
    20:32 modifié #33
    Merci pour toutes ces explications mais même si c'est possible, IBOutlet est avant tout fait pour les objets disons graphiques et intencier ceux-ci au chargement du NIB ?
  • CéroceCéroce Membre, Modérateur
    20:32 modifié #34
    Ben non, tu peux avoir besoin d'un accès à  un autre objet du nib, un contrôleur, par exemple.
  • AliGatorAliGator Membre, Modérateur
    20:32 modifié #35
    Un IBOutlet est fait pour que tu puisses connecter des objets de ton NIB à  ces outlets (donc à  tes variables d'instance de ta classe qui sont précédés du mot IBOutlet) dans IB.
    Or en général, dans un NIB on a surtout des éléments graphiques, que l'on connecte aux IBOutlets.

    Dans ce cas ton IBOutlet est en effet connecté à  par exemple un NSTextField ou une NSTextView, etc.
    Mais dans un NIB il n'y a pas que des éléments graphiques, il y a aussi le File's owner (objet qui a "désarchivé" le NIB), et souvent on met un objet qu'on appelle "App Controller" par exemple et qui nous sert de contrôlleur d'application qui centralise tout et permet de faire le lien entre les éléments de notre NIB et le code dans Xcode. Et rien ne t'empêche de relier un IBOutlet d'un objet de ton NIB à  cet AppController, qui est aussi dans ton NIB même si ce n'est pas un objet graphique.

    Donc certes dans 80% des cas un IBOutlet est connecté à  un élément graphique, mais y'a des fois où c'est à  un objet. En fait c'est pas lié, puisque l'IBOutlet dit juste que ça te permet de connecter ta variable d'instance à  un objet de ton NIB dans IB, que cet objet soit visuel ou non.


    Ensuite l'IBOutlet n'instancie pas les objets au chargement du NIB. Les fichiers NIB sont comme une "collection d'objets reliés entre eux" (par des IBOutlets justement), une sorte d'archive d'objets (que tu pourrais créer par ligne de code mais ça ferait 3km de code). C'est quand le NIB est chargé (soit le NIB principal de ton application chargé automatiquement au lancement de cette dernière, soit un NIB chargé manuellement par code) que les objets qu'il contient (graphiques ou non) sont instanciés... et que les variables d'instances notées IBOutlet qui ont été connectées dans ce NIB sont associées aux objets instanciés.
  • GercofisGercofis Membre
    20:32 modifié #36
    N'empêche, que n'empêche... Pour résumer...

    Quant on déclare IBOutlet un membre ( on va dire ) dans le .h c'est bien pour qu' IB le reconnaisse et que généralement on le connecte a un objet d'une vue ( d'une fenêtre )...

    Par contre une classe AppController ( par exemple ) est spécifiée pour une objet NIB, déclarer une classe IBOutlet même si c'est possible ne présente pas forcément grand intérêt...

    Après peut-importe les liaisons....
  • AliGatorAliGator Membre, Modérateur
    décembre 2008 modifié #37
    dans 1229004940:

    N'empêche, que n'empêche... Pour résumer...

    Quant on déclare IBOutlet un membre ( on va dire ) dans le .h c'est bien pour qu' IB le reconnaisse et que généralement on le connecte a un objet d'une vue ( d'une fenêtre )...
    Oui tout à  fait. généralement on le connecte à  un objet d'une vue, mais on peut aussi le connecter à  un objet non graphique. Et c'est très précisément très souvent le cas pour un dataSource ou un delegate qui ne sont bien souvent pas des objets graphiques, eux.
    Par exemple bien souvent le delegate, le target ou le dataSource d'un objet de ton NIB (qui sont tous trois des IBOutlets) sera connecté au File's Owner ou plus souvent encore le AppController (95% des cas on vas dire).
    Il y a aussi certains cas où avec les IBOutlets dans IB on connecte deux objets non graphiques ensemble, genre le IBOutlet de ton AppController qui pointe vers un UIViewController dans les applis iPhone, ou un IBOutlet de ton AppController qui est connecté à  un objet Drawer dans une appli OSX (l'objet Drawer n'est pas graphique, il contient lui-même un IBOutlet vers sa NSView contenant les objets graphiques à  afficher)

    dans 1229004940:
    Par contre une classe AppController ( par exemple ) est spécifiée pour une objet NIB, déclarer une classe IBOutlet même si c'est possible ne présente pas forcément grand intérêt...
    Heu j'ai pas compris ta phrase là ... "déclarer une classe IBOutlet" ??!
  • GercofisGercofis Membre
    20:32 modifié #38
    dans 1229005610:

    dans 1229004940:
    Par contre une classe AppController ( par exemple ) est spécifiée pour une objet NIB, déclarer une classe IBOutlet même si c'est possible ne présente pas forcément grand intérêt...
    Heu j'ai pas compris ta phrase là ... "déclarer une classe IBOutlet" ??!

    J'avoue patauger un peu...
    Je voulais dire IBOutlet AppController * mon controleur ;
  • AliGatorAliGator Membre, Modérateur
    20:32 modifié #39
    Ah bah si ça c'est utile aussi. Moins souvent rencontré certes mais utilisé.

    Justement par exemple si tu as un Drawer dans ta fenêtre (un objet Drawer c'est un objet non graphique, associé à  une NSView qui correspond à  ce que tu veux afficher dans ta fenêtre tiroir), en général ton AppController pointe dessus. Ou en iPhone, les UIViewControllers qui traà®nent vraiment partout, là  ça arrive assez souvent que dans ton AppController tu aies un "IBOutlet UIViewController* viewController" pour pointer sur le ViewController principal... ou encore si tu sous-classes UIViewController comme c'est quasiment le cas à  chaque fois, rajouter dedans un IBOutlet qui va te permettre de pointer sur un autre ViewController ou sur un autre objet non graphique...

    De toute façon je ne vois pas ce qui te gène, un IBOutlet est juste une variable d'instance mais qu'on peut affecter à  un objet via une connexion dans IB, que cet objet soit graphique ou non ne rentre pas dans la définition d'un IBOutlet. Dans une appli simple à  95% ce sont des objets graphiques sauf les delegate, dataSource et target qui sont souvent ton AppController, dans une appli plus complexe ou une appli iPhone ce sont bien plus souvent des objets non graphiques, genre 70%/30%, et alors ça change quoi ? tu fais juste pointer ta variable d'instance sur un objet se trouvant dans ton NIB dans IB quel qu'il soit graphique ou non ça n'entre pas en ligne de compte ;)
  • GercofisGercofis Membre
    20:32 modifié #40
    dans 1229012137:

    De toute façon je ne vois pas ce qui te gène, un IBOutlet est juste une variable d'instance mais qu'on peut affecter à  un objet via une connexion dans IB......
    Rien ne me gène j'étais simplement surpris et plutôt ravis de toutes ces précisions.
  • GercofisGercofis Membre
    20:32 modifié #41
    <br />// Person.h<br />@interface Person : NSObject {<br />	NSString * personName;<br />....<br />// MyDocument.h<br />....<br />NSMutableArray *employes;<br />....<br />-(void)insertObject:(Person *)p inEmployesAtIndex:(int)index<br />{<br />	NSLog(@&quot;Ajout de %@ à  %@&quot;,p,employes);<br />
    


    La dernière ligne sert au debug et affiche les adresses de p et employes...

    Pour le p on s'en sort comme suit ( en supposant qu'il y ait une erreur ! )

    NSLog(@Ajout de %@ à  %@",p.personName,employes);

    Mais pour employes comment fait-on ?

    La question peut-être plus générale on peut fixer une description pour une classe, comment peut-on la modifier pour une instance
  • schlumschlum Membre
    20:32 modifié #42
    C'est quoi la question ?
    Chaque %@ appelle la méthode "description" de la classe pour afficher.
    Pour NSObject ça affiche juste l'adresse hexa
    Pour NSArray, ça affiche la liste des "description" du contenu
    ...
  • GercofisGercofis Membre
    20:32 modifié #43
    On peut redéfinir la méthode description d'une classe...

    Je me demandais ( sans trop y croire ) s'il était possible de redéfinir la méthode description d'une instance d'une classe sans forcément surcharger celle-ci ?

    avec une méthode du genre
    [monInstance setDescription:@ma description];
  • schlumschlum Membre
    20:32 modifié #44
    Non   B)
    Enfin tu peux avoir une variable de classe "desc" modifiable avec "setDesc", et faire que "description" renvoie "desc" hein  ???
  • NoNo Membre
    20:32 modifié #45
    dans 1229336405:

    On peut redéfinir la méthode description d'une classe...


    Non, description est une méthode d'instance.
    Donc chaque instance est libre de renvoyer ce qu'elle veut lors de l'appel de cette méthode.
    La valeur retournée n'est qu'une NSString, donc il est facile de modifier le contenu de cette NSString en fonction du contenu (properties) de l'instance qui reçoit ce message.

    Même à  des fins de debug, j'avoue ne rien comprendre à  ta demande...
    Que voudrais tu que [tt]NSLog(@Ajout de ... à  %@",employes);[/tt] te renvoie comme description ?

    Astuce :
    [tt]NSLog(@%x, employes)[/tt] pour avoir uniquement l'adresse hexa,
    [tt]NSLog(@%@", [employes className])[/tt] pour avoir le nom de la classe.
  • GercofisGercofis Membre
    20:32 modifié #46
    c'était l'exemple qui était comme ça pour tester le passage dans un délégate, possible aussi que c'était une erreur de l'exemple...

    L'idée de className est bien et je retiens...
  • GercofisGercofis Membre
    20:32 modifié #47
    L'exercice demande l'utilisation d'une TableView sans NSArrayController, bref a l'ancienne...
    ça correspond a l'exemple du chapitre 5 de l'ancien livre page 107 à  124 que j'exécute au pas, a pas
    http://gercofis.free.fr/Cocoa/Essais.zip
    La création d'une ligne pose un problème avec le [size=12pt]datasource[/size]
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #48


    Il faut  faire un [aTableView reloadData] pour mettre à  jour.
  • GercofisGercofis Membre
    20:32 modifié #49
    Je pense que c'est fait dans le [size=12pt]createEmployes[/size],
    Rien dans les 2 exemples et ça ne fonctionne pas, en tous cas chez moi...
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #50
    Dans le nib tu n'as pas défini les "identifier" des tableColumn.

    Dans createEmploye: il faut faire [newEmployes release]; et non [employes release] qui te détruit ta NSMutableArray .

  • GercofisGercofis Membre
    décembre 2008 modifié #51
    dans 1229704230:

    Dans le nib tu n'as pas défini les "identifier" des tableColumn.
    Dans createEmploye: il faut faire [newEmployes release]; et non [employes release] qui te détruit ta NSMutableArray .
    Je venais de trouvé ça en même temps, les identifiers sur un précédent essai... en fait aucun projet n'était correct. ça m'aura bien initié a toutes ces manipulations en tous cas et normalement c'est le but, J'étais tellement sûr que c'était un problème de connexion.
    voici l'exercice correct : http://gercofis.free.fr/Cocoa/RaiseManExercice.zip...
    En tous cas merci beaucoup
  • GercofisGercofis Membre
    20:32 modifié #52
    Sans rentrer dans le détail, le codage spécifié réalisé ça a fonctionné nickel la première fois...
    Depuis impossible le menu édition correspondant reste grisé...

    J'ai essayé ceci :
    NSUndoManager *undo = [self undoManager];<br />		[undo enableUndoRegistration];<br />
    


    Il n'a pas aimé du tout, rien de plus n'est précisé, j'ai donc raté qqch ???
  • GercofisGercofis Membre
    décembre 2008 modifié #53
    En fait le problème de Undo/Redo est que le menu ne suit pas ???

    Pour l'occasion j'ai modifié le menu Apropos,Fichier,et Edition

    A l'utilisation A-Propos et Fichier apparaissent bien, mais Edition nom, j'ai bien du mal a comprendre pourquoi ?

    Précision les items du menu édition ne sont pas ceux que j'ai modifié, je n'ai donc pas mes items Undo/Redo et c'est pour ça que ça ne marche pas NSUndoManager est bien actif ( phrase rajoutée vu le post suivant ! )

    [url=http://gercofis.free.fr/Cocoa/RaiseManExercice 2.zip]http://gercofis.free.fr/Cocoa/RaiseManExercice 2.zip[/url]

  • Philippe49Philippe49 Membre
    20:32 modifié #54
    On a du mal à  comprendre ta question, ou plutôt ce qu'il y a derrière cette question.
    Je télécharge ton code, je vais regarder.
  • Philippe49Philippe49 Membre
    20:32 modifié #55
    Tu peux compléter ton zip, les classes n'y sont pas ?

    Si le menu reste grisé, c'est sans doute que tu n'as pas mis la bonne définition du undo à  faire sur la pile.
  • Philippe49Philippe49 Membre
    20:32 modifié #56
    Sais-tu que Hillegass a mis les codes de son livre sur son site du Big Nerd Ranch ?
  • GercofisGercofis Membre
    décembre 2008 modifié #57
    dans 1230030102:

    Tu peux compléter ton zip, les classes n'y sont pas ?
    Si le menu reste grisé, c'est sans doute que tu n'as pas mis la bonne définition du undo à  faire sur la pile.
    Je viens de m'en apercevoir, j'ai honte, je remets comme il faut dans la soirée... Je me demande si un grand coup de balais ne solutionnes pas les choses...

    Voilà  c'est fait [url=http://gercofis.free.fr/Cocoa/RaiseManExercice 2.zip]http://gercofis.free.fr/Cocoa/RaiseManExercice 2.zip[/url]
  • GercofisGercofis Membre
    20:32 modifié #58
    dans 1230030368:

    Sais-tu que Hillegass a mis les codes de son livre sur son site du Big Nerd Ranch ?
    Oui, oui...
  • Philippe49Philippe49 Membre
    20:32 modifié #59
    Il y a un Untitled.xib dans ton projet.
    Quand on le vire, le document ne s'ouvre plus, c'est sans doute qu'il a pris la place de MyDocument.xib lors d'une erreur de manip.
  • GercofisGercofis Membre
    20:32 modifié #60
    dans 1230068976:

    Il y a un Untitled.xib dans ton projet.
    Quand on le vire, le document ne s'ouvre plus, c'est sans doute qu'il a pris la place de MyDocument.xib lors d'une erreur de manip.
    ça confirme bien ce que je pensais, mais si tu me précises comment on trouve ça ?
    Parce que même maintenant que je la sais je ne parviens pas a le trouver, a moins qu'il soit en fichier caché ?
    Encore merci de toutes façons...
Connectez-vous ou Inscrivez-vous pour répondre.