Le Label ne met pas à  jour!

spyrtospyrto Membre
septembre 2014 modifié dans Objective-C, Swift, C, C++ #1

Bonsoir,


 


Je sèche depuis 3 jours et impossible de trouver ou ça bloque. J'ai veux afficher les coordonnées de la sourie dans une fenêtre. Simplement je récupère biens les coordonnées. Mais les coordonnées ne s'affiche sur le label corespondent.


.h



#import <Cocoa/Cocoa.h>

@interface MousePossition : NSView{
IBOutlet NSTextField *coordinateLabel;
NSPoint mouseLocation;
}

@end

.m



#import "MousePossition.h"

@implementation MousePossition

- (void)mouseDown:(NSEvent *)theEvent{
// Enregistrement des coordonées dans mouseLocation
mouseLocation = [theEvent locationInWindow];

[self updateCoordinateLabel];

// Vérification de l'exécution
NSLog(@Clicked %f %f,mouseLocation.x,mouseLocation.y);
}

-(void)updateCoordinateLabel
{
NSString *a = [[NSString alloc] initWithFormat:@Valeur en x : %f - Valeur en Y : %f, mouseLocation.x, mouseLocation.y];

// Mà J du Label avec les coordonées
[coordinateLabel setStringValue:a];
NSLog(@%@", coordinateLabel);
}

// Définition du text par defaut de coordinateLabel
- (void)awakeFromNib
{
NSString *now = [[NSString alloc] initWithFormat:@Aucune coordonée];
[coordinateLabel setObjectValue:now];
}

@end

J'ajoute aussi l'intégralité de mon projet Xcode! 


Mots clés:

Réponses

  • Am_MeAm_Me Membre
    septembre 2014 modifié #2

    Hey hey salut il serait préférable que tu passes par la case "Présentation des membres" histoire que l'on ai ton niveau, etc ... ça te prendra même pas 5 minutes et ça nous donnera une idée de ton niveau ;)


     


    PS : tout le monde y passe  :o  


  • Tu nous dis que ça ne s'affiche pas sur le label mais a tu essayé de faire un NSLog de ta variable "a" pour voir sa valeur et si c'est appelé en continu ?




  • Hey hey salut il serait préférable que tu passes par la case "Présentation des membres" histoire que l'on ai ton niveau, etc ... ça te prendra même pas 5 minutes et ça nous donnera une idée de ton niveau ;)


     


    PS : tout le monde y passe  :o  




    c'est fait ;)

  • spyrtospyrto Membre
    septembre 2014 modifié #5

    Oui j'ai fait et le NSLog de  "a" et il s'affiche correctement. Mais si je fais un NSLog de "coordinateLabel" après "[coordinateLabel setStringValue:a]" j'ai (null)


  • AliGatorAliGator Membre, Modérateur
    Tu as simplement oublié de connecter l'IBOutlet "coordinateLabel" dans ton XIB
  • Quand tu dis connexion. Tu veux dire ajouter mon objet, puis faire le lien entre le label et mon IBOutlet? Car si c'est ça je l'ai fait


  • J'ai eu à  peu près la même chose. Le Label est un "Static NSTextField" et je n'ai pas compris pourquoi je ne pouvais pas changer sa propriété "stringValue" par l'intermédiaire de l'IBOutlet.


    J'ai contourné le problème en utilisant un NSTextField non éditable sans cadre autour et avec un fond adéquat.


  • Comment je peux cree un NSTextField non editable comme tu dis?


  • AliGatorAliGator Membre, Modérateur

    J'ai eu à  peu près la même chose. Le Label est un "Static NSTextField" et je n'ai pas compris pourquoi je ne pouvais pas changer sa propriété "stringValue" par l'intermédiaire de l'IBOutlet.
    J'ai contourné le problème en utilisant un NSTextField non éditable sans cadre autour et avec un fond adéquat.

    Mouais mais là  tablier, d'après ce que nous dit spyrto, il fait un NSLog(@%@, coordinateLabel) et ça lui retourne (null)", donc c'est que c'est la @property coordinateLabel qui est nil.

    Donc soit son IBOutlet n'est pas connecté, soit il est connecté mais en fait il ne charge pas son XIB, soit il a réaffecté sa @property à  nil à  un moment donné, soit il a surchargé une méthode qu'il ne fallait pas sans appeler super... mais c'est pas le setStringValue qui déconne, c'est l'outlet qui est nil...
  • spyrtospyrto Membre
    octobre 2014 modifié #11

    J'ai du mal a suivre. Si l'IBOutlet n'était pas connecter la méthode "awakeFromNib" ne retournerait rien aussi? Chose qui n'est pas le cas ici.


    À aucun moment je n'ai réaffecté ma @proprety à  nill. Sauf si je n'ai pas compris! Je veux bien surcharger une méthode mais en deux ligne dans chaque méthode j'ai du mal à  comprendre comment. Sachant que ses même méthodes fonctionne dans d'autre test.


  • AliGatorAliGator Membre, Modérateur

    J'ai du mal a suivre. Si l'IBOutlet n'était pas connecter la méthode "awakeFromNib" ne retournerait rien aussi? Chose qui n'est pas le cas ici.

    Non, awakeFromNib est tout le temps appelé. L'objet (ton TextField ou ton Label) est bien créé. Par contre si tu n'as pas connecté l'IBOutlet dans IB, bah la @property sera nil et tu ne pourras pas y accéder par code.
  • J'ai fait marché le debugger sur la petite application et les descriptions de l'Event, de "mouselocation" et de a sont correctes:



    Printing description of theEvent:


    NSEvent: type=LMouseDown loc=(199.133,94.4688) time=1984.2 flags=0x100 win=0x6080001e2600 winNum=178 ctxt=0x0 evNum=239 click=1 buttonNumber=0 pressure=1


     


    Printing description of self->mouseLocation:


    (NSPoint) mouseLocation = (x=199.1328125, y=94.46875)


     


    Printing description of a:


    Valeur en x : 199.132812 - Valeur en Y : 94.46875



     


     


    J'ai remplacé [coordinateLabel setStringValue:a]; par  [coordinateLabel setStringValue:@25];


    Le 25 ne s'affiche pas. Aligator a raison, il y a un problème de liaison d'IBOutlet quelque part.


     


    Par contre, NSLog(@%@", coordinateLabel); parait curieux! Je pense que cela devrait s'écrire:


    NSLog(@%@", [coordinateLabel stringValue]);


  • Je comprends pas ou j'ai pas fait le liaison vu que coordinateLabel est bien liée avec le Label dans l'objet "MousePossition"


  • Chez Apple les liaisons sont fatales !
  • AliGatorAliGator Membre, Modérateur

    Je comprends pas ou j'ai pas fait le liaison vu que coordinateLabel [/size]est bien liée avec le Label [/size]dans l'objet "MousePossition"

    Fais une capture de ton XIB et en particulier de la liaison en question qu'on vérifie.

    En particulier, est-ce que tu as un petit rond REMPLI dans la marge à  gauche de ta ligne "IBOutlet NSTextField *coordinateLabel;" dans ton .h ? Si le petit rond dans la marge est vide, c'est que l'IBOutlet n'est pas connecté ; s'il est rempli c'est qu'il est connecté à  un objet dans ton XIB.

    Ci-joint une capture d'un IBOutlet connecté (bon je l'ai fait vite fait dans un projet iOS courant, mais c'est pareil pour OSX). Tu vois que c'est connecté car les cercles sont remplis, que dans l'inspecteur à  droite dans le dernier onglet il est listé dans les outlets quand je sélectionne le TextField, et que quand j'affiche la palette noire avec ctrl-clic sur le File's Owner il s'affiche aussi.
  • Voilà  la capture d'écran


     


     


  • Je viens de découvrir quelque chose qui fonctionne :)


     


    Je viens de retirer l'objet (cube bleu) "Mouse Position", puis je click sur mon custom view de classe MousePosition qui prend toute la fenêtre et de la je lie l'Outlet coordinateLabel avec Label. Magique cela fonctionne :)


     


    Simplement cela remet en question tout ce que j'ai appris jusqu'ici! Car j'avais appris qu'il fallait ajouter un objet (cube bleu), entrer sa classe, puis via cette objet faire les liens.


  • AliGatorAliGator Membre, Modérateur
    Si tu rajoutes un cube bleu dans ton XIB il sera instancié par le XIB quand le XIB sera désarchivé. En gros c'est le XIB qui va créer l'objet. Et du coup faire ensuite les connexions entre cet objet et ses IBOutlets.


    Par contre si tu crées ton objet par code via un [[MousePossition alloc] init] là  tu crées une instance dans son coin qui n'a plus aucun lien avec ton XIB ni avec aucun outlet.
  • Ok mais pourquoi cela ne fonctionnait pas, vu que les connexions était correctement fait?


     


    D'après ce que j'ai compris en ajoutent un cube bleus, c'est le xib qui crée un objet quand il en à  besoin puis fait les liens les éléments crée par celui-ci?


  • AliGatorAliGator Membre, Modérateur
    Oui du coup je pense que tu avais 2 instances de ta classe, une créée par le cube bleu par le XIB et l'autre créée autrement : soit un autre objet dans ton XIB auquel tu avais mis la même classe soit créé par code. Et du coup tu t'emmêlais les pinceaux entre les 2 tu avais bien ton awakeFromNib d'appelés sur ton instancie mais peut être as l'instance que tu pensais.

    (Bon c'est dur a voir d'ici alors qu'on avait pas ton XIB sous les yeux pour regarder je ne fais que supposer)
  • AliGatorAliGator Membre, Modérateur
    Tiens par exemple je viens de regarder ta capture à  nouveau et je vois que tu as donc ton cube bleu sélectionné sur la capture, mais tu as aussi, sur le fond de ta fenêtre, une zone verte marquée "MousePossition" (faudra que tu me corrige ce double "s" dans Position un jour ça fait tâche ^^) qui laisse donc penser que tu as un autre objet (une NSView?) dont tu as changé la classe en MousePossition dans ton XIB en + de ton cube bleu... me confortant dans l'idée que tu avais donc plusieurs objets dans ton XIB avec cette classe, ton cube bleu d'un côté et une NSView ou autre de l'autre... forcément l'un des 2 n'avait pas son IBOutlet connecté et c'est sur celui la que tu appelais tes méthodes qui faisaient les logs et pas l'autre...
  • lol oui je l'ai vu aussi le double ss il y a peu et il est déjà  corrigé :)


    Effectivement c'est bien ça. J'avais mis un custom view sur toute la fenêtre pour récupérer la position de la sourie ( je sais pas si c'est la bonne façon mais c'est la seul que j'ai trouvé )


     


    Un grand merci pour l'aide déjà !


  • CéroceCéroce Membre, Modérateur


    J'avais mis un custom view sur toute la fenêtre pour récupérer la position de la sourie ( je sais pas si c'est la bonne façon mais c'est la seul que j'ai trouvé )




    NSWindow hérite de NSResponder et peut donc recevoir les événements de la souris, mais en général, c'est plus simple de le faire dans une NSView. À cause de la chaà®ne des répondeurs, la vue sera la première à  recevoir l'événement; aussi si elle ne le transmet pas à  son nextResponder, la fenêtre ne recevra jamais rien.


    Par ailleurs, il vaut mieux sous-classer NSView que NSWindow, c'est plus simple.

  • Effectivement j'ai vu que mouseDown est dans NSWindows mais impossible de le faire fonctionner avec mon niveau actuel :)


Connectez-vous ou Inscrivez-vous pour répondre.