Le Label ne met pas à jour!
spyrto
Membre
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:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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
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 ?
c'est fait
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)
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?
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...
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.
J'ai fait marché le debugger sur la petite application et les descriptions de l'Event, de "mouselocation" et de a sont correctes:
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"
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.
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?
(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)
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à !
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