plusieurs vue avec une tool bar est-ce possible ?
chaps31
Membre
En fait j'aimerais faire exactement ce que fais une tabView mais avec une toolBar, je l'ai déjà vu dans des applis, des fenêtres de préférences... Est-ce réellement possible (s'agit-il réellement de toolbar) ? Et comment faire, je me vois mal empiler des view et faire des setHidden:YES / NO.
Merci.
Merci.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Après il suffit de lier le clic sur tes boutons de ta ToolBar à la méthode [tt]selectTabViewItemAtIndex:[/tt] en passant le bon index selon le ToolBarItem cliqué pour changer "l'onglet" affiché (ou plutôt la vue associée, puisque l'onglet en lui-même n'apparaà®t pas)
1. crées une view par toolbarItem, par exemple generalView, printView et advancedView
2. Dans Preferences.h : NSView *blankView; qui sert à vider la fenêtre lors de la transition : plus élégant
3. dans l'awakeFromNib tu installes la 1ere view par défaut :
4. une méthode pour redimensionner la fenêtre des prefs lors du changement de view :
5. les méthodes IBAction pour le changement de view :
6. nettoyer dans dealloc :
[blankView release];
Sinon question bête comment je vais pour que l'icone d'un item de la tool bar change lorsque je suis sur la vue qu'elle active, qu'elle apparaisse donc sélectionnée (grisée ou "appuyée"). J'ai beau chercher je ne trouve pas la méthode adéquat... :)beta:
Encore merci.
Non, cela ne marche pas !
setHighlighted non plus, d'ailleurs ce n'est pas dans la doc de NSToolBarItem.
Pour l'instant à part changer l'image ... ou supprimer la target du toolbaritem ...
.
Toolbars that need to indicate item selection must specify the items that can be selected by implementing the delegate method toolbarSelectableItemIdentifiers:. This method returns an array containing the identifiers of the items that can be selected. The example Listing 1in returns all the identifiers for the preferences implementation.
Listing 1 Example implementation of toolbarSelectableItemIdentifiers:
- (NSArray *)toolbarSelectableItemIdentifiers: (NSToolbar *)toolbar;
{
// Optional delegate method: Returns the identifiers of the subset of
// toolbar items that are selectable. In our case, all of them
return [NSArray arrayWithObjects:GeneralPreferences,
AccountPreferences,
AppearancePreferences,
FontsAndColorsPreferences,
AdvancedPreferences, nil];
}
Your application can specify the currently selected toolbar item using the method setSelectedItemIdentifier: passing the identifier for the desired toolbar item. The currently selected toolbar item is returned by the method selectedItemIdentifier:. If there is no currently selected, nil is returned.
- (id)initWithItemIdentifier:(NSString *)itemIdentifier
Les ToolbarItem standards ont déjà un identifier (voir Constants dans NSToolbarItem Reference)
Il suffit donc d'implémenter la méthode [tt]toolbarSelectableItemIdentifiers[/tt] en lui faisant retourner la liste des "ToolbarItems identifiers" que tu utilises dans ta toolbar...
Après soit ce sont des identifieurs maison et dans ce cas tu as dû les rentrer dans IB (à moins d'avoir créé ta ToolBar et tes items par code), soit ce sont des identifieurs prédéfinis par Apple (et tu utilise des Toolbar items classiques avec des icônes fournies par Apple) et dans ce cas ils sont indiqués dans la doc Et de toute façon tu les as certainement choisi depuis un menu déroulant dans IB, même si la dénomination dans IB (dans ton popup) n'est certainement pas la même (plus human readable) que celle à utiliser dans le code (constante C).
Sino si tu veux que tous soient sélectables, tu peux sans doute toujours faire en sorte que cette delegate method retourne le NSArray retourné par visibleItems ou encore par la delegate methode toolbarAllowedItemIdentifiers...
A l'essai c'est plutôt rigolo : "6AB2AF8E-B9E5-428D-B053-96B1ECC912AA"
Non les label c'est autre chose : The receiver's label, which normally appears in the toolbar
Je n'ai pas trouvé. Si cela est, c'est un manque dans IB. Mais rien ne t'empêche
• soit de créer toi-même ton toolbarItem avec initWIthItemIdentifier, et de le rajouter à la toolbar dans le code.
• ou de positionner les item dans la toolbar par IB, puis relever les identifier attribués par IB lors d'un appel comme validateToolbarItem: qui est envoyé à la target de l'item.
Il faut donc au minimum :
- un label interface
- un label palette de customization
- un tooltip
- une image (celle visible dans la toolbar et dans la palette) (plus compliqué quand c'est un control : NSPopUpMenu, NSSearchField, etc)
- une cible (AppController, celle qui implémente la méthode showInfos:)
- une action (showInfow:)
Si il n'y a pas d'image => on ne voit rien (ou juste le label si on les affiche).
Si il n'y a pas d'action implémentée l'itemIdentifier est inactivé.
Il faut aussi insérer l'item dans la liste des items autorisés avec :
et éventuellement dans la liste des items par défaut, avec :
Quoique... Ma toolbar purement IB fonctionne, il y a les images les labels... mais le seul truc non géré par IB est la modification de l'apparence après un clic... En mettant tout via Xcode les images se modifieront comme on le voit dans de nombreuses fenêtre de préférence où l'icone prend un aspect "enfoncé" ?
Non testée en vrai, mais je ne vois pas pourquoi ça ne marcherait pas...
L'idée c'est donc juste que si tu veux que tous tes ToolBarItems soient "selectable", il suffit de faire renvoyer par la méthode [tt]toolbarSelectableItemIdentifiers[/tt]... la liste de tous les identifiers possibles de ta ToolBar ! Donc retourne ce [toolbar visibleItems] ou encore [delegate toolbarAllowedItemIdentifiers], non ?
Ca ne fait qu'une seule méthode à implémenter, et tout le reste de ta ToolBar peut continuer à être gérée dans IB.
1) J'ai créé ma tollbar avec mes icones perso via IB uniquement.
2) J'ai créé dans xcode une classe de gestion de ma toolbar et désigné cette classe comme delegate de ma toolbar.
3) J'ai implémenté dans cette classe la méthode delegate :
Ca marche impec j'ai mes jolies icônes qui s'enfonce. :adios!:
NB : Seul hic la méthode déléguée est appelée au clic sur un item de la toolbar, donc lors du premier affichage l'item par défaut n'est pas dans son état "enfoncé", je n'ai pas réfléchi mais à mon avis cela ne va pas être bien difficile à résoudre.
1) J'avais bien pensé aux séparateurs (et dans ce cas quitte à les éliminer, autant peut-être éliminer aussi les items de type Space et FlexibleSpace ?) mais je ne suis même pas sûr qu'il faille les supprimer du tableau que tu retournes en fait : étant donné leur statut un peu particulier, je pense qu'ils ne seront jamais sélectionnables, qu'ils soient dans le tableau retourné par [tt]toolbarSelectableItemIdentifiers[/tt] ou pas. Enfin bien sûr ça reste à vérifier en testant.
En fait je pense que quand tu cliques sur un ToolbarItem, Cocoa appelle cette delegate method, puis regarde si l'identifier du ToolbarItem cliqué se trouve dans ce tableau pour savoir s'il doit le sélectionner ou pas. Et comme un NSToolbarSeparatorItem n'est pas cliquable...
Donc si c'est bien comme ça que ça fonctionne, ça n'a pas d'incidence de laisser les identifieurs de séparateur dans le tableau, autant retourner directement [tt][toolbar visibleItems][/tt] sans autre forme de procès
2) Sinon si tu gardes ton code, d'une part je te conseille d'utiliser la constante [tt]NSToolbarSeparatorItemIdentifier[/tt] (cf doc de NSToolbarItem) plutôt que la chaà®ne @NSToolbarSeparatorItem. C'est plus propre, ça évite les problèmes si un jour la valeur change, et surtout ça te signale le problème si tu fais une faute de frappe dans la constante
3) De plus, dans ton code, tu crées un NSMutableArray mais tu ne respectes pas les règles de base de gestion mémoire. Il te manque un autorelease sur ton idTab. Ou alors au lieu de le créer avec alloc/init (et de rajouter donc l'autorelease), utilise le constructeur de commodité "array" qui est équivalent à alloc/init/autorelease.
2° Je renote... moins vite...
3) je note aussi :P
Merci
En effet petit oubli.. hum et mon projet va nécessiter autant de mémoire que Vista... Pardon de dire des grossièretés :P
C'est le même problème pour la méthode déléguée :
les IBOutlets connectés dans IB :
et la méthode de sélection au démarrage devient par exemple :
Mais c'est plus de code et moins "générique".
Les items visibles dans la Toolbar (panel fermé) sont les items par défaut.
Tout le paramètrage se fait dans le panel, sauf, actuellement, le choix selectable ou non et la validation ou non des items qui demandent encore du code. Mais cela peut changer dans les prochaines versions d'IB.
EDIT : Quand je balade le lien dans IB il me semble qu'il y a un beau bug, un rectangle de sélection apparait mais il n'encadre rien... il est dans le vide avec dessus le nom d'un de mes item de toolbar, et lorsque je passe sur les items il ne se passe rien...