Comment mettre une NSTabView en mode disabled ?

Eddy58Eddy58 Membre
09:42 modifié dans API AppKit #1
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 ?  ???

Réponses

  • ClicCoolClicCool Membre
    09:42 modifié #2
    Salut Eddy :)

    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 ;)
  • Eddy58Eddy58 Membre
    09:42 modifié #3
    Salut ClicCool :)

    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 ?) ;)
  • ClicCoolClicCool Membre
    09:42 modifié #4
    dans 1095254480:

    La première méthode est bien mais un peu lourde à  mettre en oeuvre non ?

    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


    En tout ca merci ClicCool, le bindingologue (c'est comme ca qu'on dit ?) ;)

    Oui oui et PAS le dingologue surtout  ;D ;)
  • Eddy58Eddy58 Membre
    09:42 modifié #5
    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.


    Oui mais si je range ma NSTabView dans une variable, qu'ensuite je vire la NSTabView, toutes les subviews vont virer aussi avec non ?  ???

    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


    Oui t'es là  Arldon ? Dis nous tout !  :rose!:  :)

    Oui oui et PAS le dingologue surtout  


    Je ne m'y risquerais pas !  ::) ;)
  • mpergandmpergand Membre
    septembre 2004 modifié #6
    Pour activer/désactiver tous les objets d'une view, Bru avait donné une solution ICI

    J'utilise une methode similaire:
    <br />NSArray v=contentView().subviews();<br />for(int i=0;i&lt;v.count();i++)<br /> {<br /> NSObject o=(NSObject)v.objectAtIndex(i);<br />  if( o instanceof NSControl)<br />               ((NSControl) o).setEnabled(enabled);<br />      }<br /><br />
    


    Sinon au niveau du NSTabViewItem, un setView avec null devrait faire l'affaire...
    Et encore plus simple avec Panther setHidden !
  • septembre 2004 modifié #7
    Les fleurs ne suffisent pas à  Arldon, il faut vénérer Arldon pour qu'Arldon daigne participer à  ces discussions. ( ;D faut bien qu'il serve un peu celui-là : o:) )

    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...

    o:) o:) Arldon a parlé  o:) o:)
  • 09:42 modifié #8
    Oui mais si je range ma NSTabView dans une variable, qu'ensuite je vire la NSTabView, toutes les subviews vont virer aussi avec non ?  ???


    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).
  • Eddy58Eddy58 Membre
    09:42 modifié #9
    @Mpergand : Oui je suis au courant de la solution proposée par Bru pour disabled/enabled les objets d'une view. Ca ce n'est pas un problème je sais faire....C'est les NSTabView qui sont récalcitrants  :-\ Pourquoi diable n'on-t-ils pas été conçus pour hériter de NSControl ? Enfin bon merci pour le setHidden, je vais voir ce que ca fait :)

    @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  o:)   ;D
  • Eddy58Eddy58 Membre
    09:42 modifié #10
    dans 1095284113:

    Oui mais si je range ma NSTabView dans une variable, qu'ensuite je vire la NSTabView, toutes les subviews vont virer aussi avec non ?  ???


    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).


    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 ?
  • 09:42 modifié #11
    dans 1095285093:

    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.
  • Eddy58Eddy58 Membre
    09:42 modifié #12
    dans 1095285739:

    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 ! :o 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... :)
  • mpergandmpergand Membre
    09:42 modifié #13
    dans 1095287270:

    Bon le setHidden, c'est pas ça....en effet ça hide tout ! :o Alors qu'en faites j'ai encore besoin d'avoir certains éléments enabled pour certaines raisons...


    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]
  • Eddy58Eddy58 Membre
    09:42 modifié #14
    :D Ok Mpergand mais l'intérieur de la NSTabView n'est pas un problème.....le problème était le NSTabView en lui-même, mais je l'ai réglé en utilisant les méthodes addTabViewItem: et removeTabViewItem: . Quand il le faut, je retire les NSTabViewItems avec removeTabViewItem, tout en gardant le NSTabViewItem sélectionné, et ensuite quand j'en ai besoin je remet les NSTabViewItems que j'avais retiré avec addTabViewItem. Je trouve que c'est une solution simple et élégante à  la fois...  :)

    Merci pour tout
  • ClicCoolClicCool Membre
    09:42 modifié #15
    Salut Eddy :)

    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)
  • Eddy58Eddy58 Membre
    09:42 modifié #16
    Salut ClicCool :)

    Tu as raison cette solution est probablement la plus élégante avec les NSTabView.


    T'as vu tu peux mettre une 4e méthode dans ton répertoire maintenant !  :D

    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


    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)
Connectez-vous ou Inscrivez-vous pour répondre.