Groupe d'objets
Bonsoir à tous,
j'ai fait une recherche sans grand résultat pour savoir s'il était possible de griser des boutons (contenus dans un groupe) après avoir cliqué sur l'un d'eux; Je vous traduit ça en langage simple :
//déclarations des boutons
bouton1;
bouton2;
bouton3;
bouton4;
//déclaration du groupe boutons
groupeBoutons = tous les boutons
//code
if (appuiBouton1,2,3 ou 4 = yes) alors {
bouton1.grisé;
bouton2.grisé;
bouton3.grisé;
bouton4.grisé;
}
ou
plus précisément j'aimerai avoir :
//code
if (appuiBouton1,2,3 ou 4 = yes) alors {
groupeBoutons.grisé;
}
j'espère que c'est plus compréhensible de cette manière. Si ce n'est pas possible je ferai bouton par bouton mais vu qu'il y en aura beaucoup j'aimerai une fonction groupée.
Merci pour votre aide
neospirit
j'ai fait une recherche sans grand résultat pour savoir s'il était possible de griser des boutons (contenus dans un groupe) après avoir cliqué sur l'un d'eux; Je vous traduit ça en langage simple :
//déclarations des boutons
bouton1;
bouton2;
bouton3;
bouton4;
//déclaration du groupe boutons
groupeBoutons = tous les boutons
//code
if (appuiBouton1,2,3 ou 4 = yes) alors {
bouton1.grisé;
bouton2.grisé;
bouton3.grisé;
bouton4.grisé;
}
ou
plus précisément j'aimerai avoir :
//code
if (appuiBouton1,2,3 ou 4 = yes) alors {
groupeBoutons.grisé;
}
j'espère que c'est plus compréhensible de cette manière. Si ce n'est pas possible je ferai bouton par bouton mais vu qu'il y en aura beaucoup j'aimerai une fonction groupée.
Merci pour votre aide
neospirit
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Déjà discuté sur ce forum, il y a quelques années ...
Merci pour l'info mpergand mais je ne comprends pas vraiment ce que tu as écrit en code. Je comprends le fait de sous-classer NSBox (et encore...) mais je vois pas trop le rapport avec mes boutons que je veux cacher en cliquant sur l'un d'entre eux.
Pourrais-tu détailler svp ?
Merci
neospirit
Tu n'as qu'à regarder les méthodes
subviews de NSView http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/doc/uid/20000014-BBCDFGAG
setEnabled de NSControl http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSControl_Class/Reference/Reference.html#//apple_ref/doc/uid/20000073-setEnabled_
Et isKindOfClass de NSObject Protocol http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/doc/uid/20000052-BBCBFBDJ
Maintenant tu parles de les cacher, ce n'est pas la même méthode, c'est setHidden: et ça peut s'appliquer aussi au NSViews.
Sinon, pour traiter des groupes d'objets, on peut utiliser les tags.
groupe1 -> tags 100, 101, 102, ...
groupe2 -> tags 200, 201, 202, ...
On récupère l'objet avec la méthode viewWithTag:
et on fait le traitement dans une boucle.
Imaginons 3 boutons (1 sur différentes vues). En fait j'en aurais plus d'une quinzaine, j'aimerais donc minimiser le code au maximum.
Quand je clique sur l'un de ces 3 boutons, les 3 boutons devront se griser et en fonction du bouton cliqué, j'incrémente une variable attachée à un bouton. (ex : si j'appuie sur bouton1, j'incrémente variable1. Si j'appuie sur bouton2, j'incrémente variable2, etc)
Derrière ça, je voudrais savoir si c'est possible de faire une IBAction générique, c'est-à -dire identifier sur quel bouton j'ai appuyé sans avoir une IBAction par bouton. Car ensuite chaque bouton fait les mêmes actions sauf 1 actions propre à chaque bouton, à savoir incrémenter la variable attachée au bouton.
Est-il possible de faire cela :
Fichier .h
@interface BoutonViewController : UIViewController {
IBOutlet UIButton *bouton1;
IBOutlet UIButton *bouton2;
IBOutlet UIButton *bouton3;
@property (nonatomic, retain) IBOutlet UIButton *bouton1;
@property (nonatomic, retain) IBOutlet UIButton *bouton2;
@property (nonatomic, retain) IBOutlet UIButton *bouton3;
}
- (void) incVariableBoutonX:(IBOutlet UIButton *) boutonX;
Fichier .m
//fonction appelant plusieurs fonctions après appui d'un bouton
- (void) incVariableBoutonX:(IBOutlet UIButton *) boutonX {
[self griserBoutons];
[self incVariableX];
}
Merci pour votre réponse
neospirit
Une NSMatrix permet d'avoir une action quand on clique dessus ou sur n'importe laquelle de ses cellules, elle permet aussi tout un tas de configurations qui semblent correspondre à tes besoins
Référence: http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSMatrix_Class/Reference/Reference.html#//apple_ref/doc/uid/20000106-SW18
Programming Guide: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Matrix/Matrix.html%23//apple_ref/doc/uid/10000022-CJBEGHBI
Pour la créer dans Interface Builder tu crées d'abord tes boutons, tu les sélectionnes tous, puis dans le menu "Layout" -> "Embed Objects In" -> "Matrix"
J'ai créé cette méthode :
J'ai ensuite lié les boutons à "Actions received" du File's owner dans Interface builder et voilà ! Je suis presque satisfait.
Parce que maintenant j'ai un autre problème. Le bouton sur lequel je clique ne veut plus se cacher avec
car je suppose qu'il est utilisé par l'application. Y a t il un moyen de le libérer pour le cacher ? Sachant qu'au final je vais griser et non cacher les boutons finalement...
Merci pour vos suggestions
neospirit
Car là tu vois bien que tu restes pas le plus efficace avec ta solution vu que tu es obligé de mettre un switch/case avec autant de "case" que tu auras de bouton... et alors que le code dans chaque "case" est très similaire !
Alors qu'avec un tableau (de type C, pas un NSArray, on pourrait mais pour un tableau de largeur fixe, contenant juste des entiers qui plus est, autant prendre un bête tableau C) tu peux utiliser le tag du bouton aussi pour indexer ton tableau.
Bien sûr pour que cela marche, il faut que tu donnes un tag différent à chacun de tes boutons dans InterfaceBuilder, que tu inscrives la valeur 1 dans la case "tag" de la palette de propriété pour le premier bouton, la valeur 2 pour le 2e bouton, etc.
PS : dans ton exemple plus haut tu parles de "UIButton", pourtant le sujet est dans le forum "MacOSX" et pas "iOS"... du coup c'est quoi c'est ton exemple qui est mauvais ou c'est que tu n'as pas mis dans la bonne section ? Tu veux pour mac ou pour iOS ? Ceci dit de toutes façon là vu la question c'est pas plutôt une question qui marche pour les deux, et donc que tu aurais dû mettre dans la section commune ? (Merci de bien mettre vos questions dans la bonne question, y'a pas un seul jour sur le forum où y'a pas un message posté au mauvais endroit c'est lassant et bcp de boulot de tout reventiller... quand on a le temps...)
Pour le reste, ce que tu me conseilles est effectivement une meilleur méthode que la mienne. J'ai essayé sauf que l'application crashe alors que j'ai fait comme tu dis.
Par contre, as-tu une idée pour les boutons qui ne se cachent pas ?
Merci
neospirit
Pour l'instant, je ne vois pas où initialiser mes index de tableau à part dans la fonction elle même...
Pour initialiser ton tableau, le meilleur endroit c'est dans les méthodes d'initialisation, comme "viewDidLoad" si c'est un ViewController, ou les variantes de "init" (initWithCoder si ta classe est désarchivé d'un XIB, initWithFrame si c'est une UIView, initWithNibName:bundle si c'est un ViewController, init tout court si c'est un NSObject, ...)...
Ou alors dans le applicationDidFinishLaunchingWithOptions de ton AppDelegate si tes variables ont un scope appwide, ça dépend où tu comptes mettre ton ivar tableauIncVar finalement.
Il renvoie le tag du bouton. Et j'ai trouvé pourquoi ça crashait. J'avais oublié de supprimer une liaison d'un bouton vers une IBAction qui n'existait plus.
Quand tu parles de tester "indexBtn", veux tu dire juste avec un simple if (0 < indexBtn < x), x étant ma valeur de tag de bouton max ?
Ensuite pour les valeurs du tableau, elles seront égales à des valeurs qui seront stockées dans un .plist. J'ai juste initialisé un tableau pour tester ma fonction cliqueBouton.