Contrôler la validation d'un bouton
muqaddar
Administrateur
Yop,
Comment s'y prendre pour contrôler l'activation (setEnable) d'un bouton valider d'une sheet, sachant que celui-ci doit être actif que si tous les champs on été remplis ou sélectionnés (popup, fields...etc). Je pense au delegate, et à une méthode associée, mais sur chaque champ ? Y a t-il une autre solution ?
Merci. :why?:
Comment s'y prendre pour contrôler l'activation (setEnable) d'un bouton valider d'une sheet, sachant que celui-ci doit être actif que si tous les champs on été remplis ou sélectionnés (popup, fields...etc). Je pense au delegate, et à une méthode associée, mais sur chaque champ ? Y a t-il une autre solution ?
Merci. :why?:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Super réponse.
A ce propos, les observers sont à déclarer ds le awakeFromNib obligatoirement ?
C'est le mieux ?
Et bien je déclare toujours mes notifications dans awakeFromNib:, ou init: si j'ai besoin de la notification avant l'initialisation des objets nib, je pense que c'est le mieux, mais je ne connais pas tout des notifications, il ne m'étonnerait pas qu'il existe des cas particuliers... 8)
Et :
ça marche à moitié, en fait, quand je change ma sélection, la nouvelle notification n'est pas envoyée, mais si je reclique sur le popup, elle passe...
ça doit venir de : NSPopUpButtonWillPopUpNotification qui n'est pas être pas la plus appropriée... mais j'en ai pas vu d'autre pour les popup ! So what ?
Comme tu ne spécifies pas d'objet à la notification (si tu veux surveiller les changements d'un objet précis), ça ne change rien de le faire avant ou après. Par contre si tu spécifies un objet, il faut que l'objet soit créé, et donc il faut le faire après initialisation de l'objet (le awakeFromNib est le bon endroit). Si tu le fais avant, nil sera renvoyé pour l'objet et donc ça revient à observer toutes les notifications.
Voili voulou.
personnellement, j'ai dans le controller de mes sheet (et autres dialogues) une méthode
qui est appelée par chaque object de la sheet/fenêtre en question, de façon à vérifier l'état des différents éléments d'interface et ensuite valider un bouton "OK" ou non.
Pour les NSTextFields, si je veux être au courant dès le premier caractère tapé (et non quand on quitte le champ) mon controller est son delegate et j'implémente
qui se contente d'appeler [self itemChanged: nil].
Pour les items qui ont une IBAction dédiée, juste avant la fin de celle-ci j'appelle aussi [self itemChanged: nil].
J'ai toujours utilisé cette méthode avec des textfields, donc là je peux qu'essayer de t'aiguiller....
En faites, ce qui se passe actuellement, c'est que quand tu changes une premiere fois la sélection du pop-up, la notification n'est pas envoyée, mais quand tu recliques dessus une deuxieme fois ca marche ? ???
Pourtant NSPopUpButtonWillPopUpNotification est sensée marcher lors d'un mouse-down event, donc je comprend pas...
Essaie en spécifiant le nom de ton pop-up dans le paramètre object, pour voir si ca améliore les choses, ou alors en faisant une action classique sur ton pop-up dans IB, et récupérer le résultat dans une méthode à part. Sinon là pour l'instant je vois pas, NSPopUpButtonCell propose aussi une notification mais elle est du même genre que celle de NSPopUpButton...
Si je change de selection, ça ne fait rien, mais si je reclique juste sur le popup, même sans changer de selected item, ça marche, là ça prend en compte la sélection précédente, la notification passe. J'ai ajouté l'objet sans succès.
ça vient pas de ma double notification dans la même méthode ?
Je préfère de loin une globale (ail ! pas taper !) et un bon vieux
updateUI
{
[bouton activer:globale]
}
Evidemment la globale est modifiée dans l'action des éléments style globale=[text length]>0;....
Pas de globale et un updateUI genre :
{
BOOL b=[text Length]>0 && [popUp selection]==2 && serbraxuaepmirperemdnargam
[bouton actvier:b];
}
Merci pour toutes vos combines. Je vais essayer de "magouiller" une action générique. Pas glop quand même que d'autres notifications n'existent pas pour NSPopupButton.
ça a l'air bien compliqué ce pb:
- Utiliser une globale n'est jamais une bonne solution même si ça marche.
- Les Notifications existantes ne semblent pas utilisables pour un Pop up.
Quel dommage qu'Apple ne nous fournisse pas un moyen facile et fiable de lier les statuts d'un bouton à une série de condition...
Ah ben oui! ce serait génial ça ! un système qui relie le model objet avec les éléments d'interfaces et les éléments d'interface entre eux. Des sorte de liens dynamiques automatiquement mis à jour et tout et tout.
On pourait appeler ça des "liens"?
Non faut penser aux anglophones ... des "Bindings" alors ?
Ah oui se serait super chouette ça, on va tous écrire à Apple pour réclamer des Bindings. :boss):
En plus ça irait pil poil avec les ambitions de Tiger pour gérer aussi le stockage du model sur disque (en XML, SQLLite etc ...).
Bon sang ! j'espère qu'il est pas trop tard et qu'Apple va avoir le temps d'inventer les Bindings avant la sortie de Tiger histoire qu'on s'habitue à ce que l'avenir nous réserve comme bonnes choses.
Voili voilou (comme dirait un certain canard)
Tu sais ce que j'en pense des bindings à l'heure actuelle. hihi
:-*
Ben oui je sais
T'en penses que c'est tellement pratique, efficace et facile que tu t'imposes de t'en passer pour t'aguérir dans ton apprentissage de Cocoa.
Et tu a bien raison de faire ainsi :-*
N'empèche que c'est tellement pratique, efficace et facile ... :kicking:
En fait tous les objets se voient attribuer un identifier(NSString) à partir de IB (ça demande donc de créer de nouvelles palettes, et de sous-classer les principaux types de contrôles). Lorsque les contrôles changent d'état, ils envoient un message au file's owner, avec eux comme argument. Quand une variable change d'état dans le file's owner, elle envoient une notification reçues par les contrôles qui se trouvent dans des fenêtres dépendant de lui.
Les notifications sont justement conçues pour renseigner...les notifications sont là pour permettre d'intercepter des évènements de manière élégante....et de plus elle a toute son utilité ici car a chaque changement dans tes textfields, tu peux en déduire tout de suite l'état de ton bouton.
Les trucs globaux, c'est du bricolage en Objective-Cocoa, tandis que les notifications font parties des cocoas design patterns... ;D
Oxitan, tu peux faire une action générique dans IB sur tes pop-ups, puis avec cette action tu appel la méthode appelée par la notification :
Merci pour tout.
de mon côté, si je devais m'emputer des bindings, je ne ferais pas ça, et surtout je garderais les bonnes habitudes de tout codeur (bindeur) à savoir l'usage des ACCESSEURS.
Ce n'est pas ton action d'un élément graphique qui doit être responsable d'appeler ta méthode de mise à jour de ceci ou cela.
Et si ton interface évolue et permet de modifier la valeur depuis plusieurs objets d'interface ?
Et si tu modifies tes données par ton code ?
Ton action popUp doit simplement appeler un accesseur: setValue.
Et bien sur dans ton setValue tu peux poster une notification après avoir vérifié si la valeur est effectivement différente ou mieux si le setValue écrit une valeur là ou il y en avait pas ou inversement enlève une valeur préexistante ...
(Tu teste la valeur à placer et la valeur préexistante, si elles sont toutes deux vides ou toutes deux non vides tu postes rien, si une seule des deux est vide tu postes ta notification perso)
Quelle horreur les amputations, surtout de bindings !
Oui ClicCool, tout est envisageable... effectivement si la gestion de l'interface se complique par exemple en se partageant dans plusieurs controleurs, des accesseurs dédiés sont une bonne solution pour une bonne structure du code, mais si l'élément d'interface n'est géré que par un seul contrôleur, je pense qu'il est inutile de surcharger le code avec d'autres méthodes...