Comment mettre une NSTabView en mode disabled ?
Eddy58
Membre
J'ai besoin d'interdire la manipulation des NSTabViewItem d'une NSTabView ? Hors cette classe n'hérite pas de NSControl et des méthodes adéquates..... Comment faire ? ???
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
En effet pour ce qui est de désactiver un tabView Item, chacun y va à sa façon dans la mesure ou ce n'est pas prévu. :-\
En gros 3 méthodes sont utilisables:
La 3 ème c'est de laisser l'item actif mais de désactiver tous les contrôles contenus dans la vue correspondante.
La 2 ème c'est d'utiliser la méthode déléguée de la TabView:
- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem
et de renvoyer faux quand c'est l'item indésirable qui a été cliqué.
ça va bien interdire au TbViewItem d'être sélectionné mais malheureusement ça ne le fera pas apparaà®tre comme clairement désactivé (il sera pas grisé)
La 1ère c'est de virer purement et simplement le TabViewItem et sa vue, quitte à sauvegarder la vue dans une variable pour pouvoir la réinsérer plus tard. (une technique d'Arldon© que je lui ais pompé ;D mais lui dit surtout pas
Je pense que dans mon cas, je vais combiner la 2e et 3e méthode. La première méthode est bien mais un peu lourde à mettre en oeuvre non ?
En tout ca merci ClicCool, le bindingologue (c'est comme ca qu'on dit ?)
Pas tellement, tu range sagement ta NSView dans une variable d'intance de ton controleur par exemple et la replace donc exactement telle quel plus tard.
Peut être Arldon utilise une méthode particulière ? (t'es là Arldon ?) mais dans l'ensemble c'est fastoche finalement et surtout redoutablement efficace ;D
Oui oui et PAS le dingologue surtout ;D
Oui mais si je range ma NSTabView dans une variable, qu'ensuite je vire la NSTabView, toutes les subviews vont virer aussi avec non ? ???
Oui t'es là Arldon ? Dis nous tout ! :rose!:
Je ne m'y risquerais pas ! ::)
J'utilise une methode similaire:
Sinon au niveau du NSTabViewItem, un setView avec null devrait faire l'affaire...
Et encore plus simple avec Panther setHidden !
Arldon n'a jamais utilisé de telles méthodes, c'est juste une solution que Arldon a suggéré a une personne qui posé la question dans un autre forum. Le problème que cette personne avait était qu'il avait normalement 4 éléments dans sa TabView, et 3 dans certains cas. Il se demandait comment faire pour résoudre ce problème (c'est bien ça ClicCool?).
Quand Arldon désire avoir ce type de comportement, il retient les contrôlleurs des vues (un controlleur par vue donc) dans un NSArray, contrôlleurs qui peuvent renvoyer les données (ce qui permet également d'éviter les problèmes liés aux "disparitions" d'outlets, ou la création d'un nombre important d'outlets), et la vue également bien sûr. C'est assez lourd évidemment, mais dans mon cas chaque vue est originaire d'un plug-in, donc pas le choix...
Arldon a parléÂ
Tu dois faire un retain de la vue du tabview avant de supprimer la tabview et il n'y aura pas de problème (si tu as construit ton NSTabView entièrement dans IB, avec toutes les vues déjà dedans), sinon (recommandé) tu mets la vue en question non pas dans la tabview, mais dans le .nib directement (autrement dit, au même niveau qu'une fenêtre), et tu ajoutes le TabView au moment de l'ouverture du fichier. De cette façon, tu n'as pas à te soucier la gestion de la mémoire, et il n'est pas nécessaire de faire une méthode qui teste s'il faut supprimer la vue au démarrage (je ne connais pas le contexte de ton app, donc je fais quelques suppositions).
@Arldon : C'est coton ton affaire ! Il faudrait que j'expérimente ton principe un de ces quatre, ça demande quand même pas mal de boulot, mais le résultat doit être sympa...
Merci ô vénérable Arldon de daigner me répondre ;D
OK, en faites tu utilises le principe d'offscreen, c'est ca ? j'utilise ce principe pour des éléments d'interface qui changent en fonction du choix d'un bouton pop-up. C'est la même marche à suivre en gros ?
En très gros . Dans le cas des tabviewitem, tu dois créer un tabviewitem, lui assigner une contentview, un label et l'insérer, ou simplement supprimer un tabviewitem (note que tu peux faire une variable d'instance pour le tabviewitem plutot que pour la vue qu'il contient, ça simplfie les choses). Ce n'est pas la même chose que de supprimer une subview et la remplacer par une autre.
Bon le setHidden, c'est pas ça....en effet ça hide tout ! Alors qu'en faites j'ai encore besoin d'avoir certains éléments enabled pour certaines raisons... En faites je commencais à penser comme toi Arldon...je vais faire des variables d'instances pour les tabViewItems et jouer avec addTabViewItem et removeTabViewItem....ouai... je vais faire comme ca...
Ben dans ce cas il faut que tu mettes ces objets dans des vues différentes (NSBox) et que tu appliques la méthode de BRU sur les vues contenant les objets à désactiver.
[Fichier joint supprimé par l'administrateur]
Merci pour tout
Tu as raison cette solution est probablement la plus élégante avec les NSTabView.
Mais nous avons oublié que depuis la 10.3 il y a de véritables contrôles pouvant dans ton cas remplacer l'usage des NSTabView qui justement ne sont pas vraiment des contrôles.
Ils permettent d'implémenter la barre d'icone du finder pour le choix de présentation d'une fenettre, la barre d'iPhoto avec importer/organiser/modifier/livre etc..
Tu vois pas ?
Mais si! , ceux sont les NSSegmentedControl
Chaque segment peut être active/désactivé indépendament.
Seul hic, I.B. ne les connait pas encore très bien mais c'est facilement contournable.
Il faut demander à IB de lire NSSegmentedControl.h dans le nib, puis créer une custom view en barre horizontale que tu défini comme élément de la classe NSSegmentedControl.
jettes un oeil à Cocoa: Segmented Controls
A mon sens c'est là qu'est la solution élégante d'avenir 8)
T'as vu tu peux mettre une 4e méthode dans ton répertoire maintenant !
Ha ouai ! Merci ClicCool, je connaissais d'aspect, je me demandais comment faire justement. Je croyais que c'était des classes trafiquées, mais là tu viens de m'apprendre quelque chose. Ca a l'air vraiment très souple d'emploi et performant. Je vais mettre en oeuvre les Segmented Controls pour mon prochain projet. :P
Bien bien bien 8)