super.super.view addsubview comment faire ?

yodarkyodark Membre
20:53 modifié dans API UIKit #1
bonjour à  tous,

J'ai une hiérarchie de vue suivante

Window -> VueBackground -> TabBarController -> VueduTaBar
à  un certain moment je voudrais créer une une sous vue de VueBackground afin de l'avoir en plein écran. Comment puis-je atteindre la VueBackground pour lui faire addsubview ?
Ce que je voudrais faire c'est simplement afficher une nouvelle vue en plein écran comment faire ?

Réponses

  • CéroceCéroce Membre, Modérateur
    20:53 modifié #2
    Tu peux obtenir la vue parente par -[NSView superview].

    Seulement, ce n'est pas ce qu'il faut faire. Puisque tu respectes le paradigme MVC (pas vrai ?  ;)), ton contrôleur possède une outlet vers la vue parente.
  • yodarkyodark Membre
    20:53 modifié #3
    Je ne vois pas vraiment ce que tu veux dire Céroce...  8--)
    Ce que je veux faire n'est pas compatible avec le paradigme MVC ? Alors comment faire pour avoir quelque chose en plein écran se superposant au tabbar ? Bien sûre ma nouvelle vue se possède son propre view controller !
  • CéroceCéroce Membre, Modérateur
    20:53 modifié #4
    Mince, je viens de me rendre compte qu'on parlait de l'iPhone (je m'étais promis d'arrêter d'y répondre pour pas écrire de bêtises).

    Enfin, ça ne change probablement rien.
    Ce que je veux dire, c'est qu'en respectant le paradigme MVC, jamais deux vues ne communiquent ensemble. Ta première vue déclenche une action du contrôleur, qui va demander à  la seconde de se mettre en plein écran (vers laquelle il possède une outlet).
  • AliGatorAliGator Membre, Modérateur
    20:53 modifié #5
    Oui soit dans le code de ta "VueDuTabBar" (puisqu'apparament c'est à  cet endroit que tu comptais mettre le code pour changer ta vue et mettre l'autre en plein écran) tu memandes à  VueBackground de changer sa "view" (qui est actuellement celle de ton TabBarController) pour la remplacer par ta nouvelle (celle en plein écran)... et pour ça le plus simple ce serait d'avoir un IBOutlet dans VueDuTabBar qui pointe sur VueBackground... mais c'est pas très MVC car tu fais dépendre tes deux vues l'une de l'autre.

    Il faut donc plutôt, comme le dit Céroce, que tu aies une IBAction dans ton contrôleur (tu as sans doute un AppController dans ton NIB j'imagine), genre [tt]-(IBAction)showFullscreenView:(id)sender[/tt]. Cette IBAction codée dans ton AppController ferait juste un [backgroundView.view = myFullscreenView] (après avoir créé ta myFullscreenView en la chargeant depuis un NIB par exemple). Et pour ça il suffit de rajouter un IBOutlet dans ton AppController que tu connectes à  ta backgroundView. Ou alors sinon utiliser window.view qui doit normalement pointer sur ta backgroundView...

    Ceci dit c'est pour quoi faire ? Pour genre "revenir à  l'écran principal de ton appli" ? Si c'est ça tu peut p'tet plutôt utiliser un NavigationController pour encapsuler tes 2 parties d'appli (celle avec ton "écran principal en fullscreen" et celle avec ta TabBarController qui encapsule elle même une vue par tab) ? Ou c'est pour afficher une zone de saisie modale ? Dans ce cas c'est les MovalViewControllers qu'il faut utiliser (enfin je crois, sinon dans la doc iPhone sur les ViewControllers tout les cas possibles sont expliqués avec des illustrations et des bouts de code).

    Et puis dans le titre de ton post tu parles de "addsubview" ? Tu veux rajouter une subview à  ta backgroundView ? ça n'enlèverais pas ta vue du TabBar actuelle dans ce cas (la TabBarController.view) mais rajotuerai la vue par dessus au lieu de la remplacer (peut-être qu'au niveau visuel, si la frame de ta vue que tu rajoutes prend tout l'écran, ça va finir par donner la même chose, mais en réalité tu auras toujours ta vue de tabbar qui traà®ne en dessous même si tu la vois pas et donc chargée en mémoire pour rien !) Faut mieux remplacer la view de ta backgroundView par la nouvelle dans ce cas !
  • yodarkyodark Membre
    20:53 modifié #6
    le but n'est pas de supprimer le tab bar mais de mettre une vue qui la recouvre completement ! Un peu comme un message d'alerte qui attends d'être fermé pour faire réaparaitre l'application. Dans ce cas ma question est comment faire une vue qui recouvre le tabbar ?
  • AliGatorAliGator Membre, Modérateur
    20:53 modifié #7
    Ben oui c'est pour ça que je te posais la question, est-ce que ta vue que tu veux afficher :
    - est genre on écran principal (donc tu changes de vue, genre tu vas à  un autre "endroit" dans ton appli dans ta GUI, et tu pourras revenir à  cet endroit avec tes tabbars après) --> remplacer la window.view
    - est sensée être une vue modale qui s'affiche juste pour afficher une information à  l'utilisateur, un peu comme une alerte ou une "sheet window" -> utiliser un ModalViewController
    - est sensée être une vue qui s'affiche à  l'utilisateur pour qu'il indique une action à  effectuer en cliquant sur un bouton -> UIActionSheet
    - est sensée être une "vue de détail" de l'élément que tu as cliqué dans ta vue avec le tabbar, pour t'afficher l'élément cliqué en grand par exemple, et une fois que tu as vu cet élément, revenir à  la vue avec ton tabbar ? --> UINavigationController par dessus le TabBarController

    Bref selon ce que tu veux faire, il y a plusieurs possibilités et il nous manque les détails du cas d'utilisation de ton application pour faire ça dans les règles (GUI guidelines d'Apple)
    Je te conseille la lecture entre autres de toute cette partie de la doc qui décrit les possibilités offertes par les ViewControllers et dans quel cas utiliser l'un ou l'autre des solutions.
  • yodarkyodark Membre
    décembre 2008 modifié #8
    La vue que je voudrais afficher est une vue modale juste pour afficher un message à  l'utilisateur. J'ai suivi ton lien de documentation
    J'ai crée le code suivant en me basant sur la page http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/PresentingModelViewControllers/chapter_8_section_1.html
    <br />InfoSheetViewController * mInfoSheetViewController =&nbsp; [[InfoSheetViewController alloc] initWithNibName:@&quot;InfoSheet&quot; bundle:nil];<br />			//[super.view addSubview:mInfoSheetViewController.view];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UINavigationController *secondNavigationController = [[UINavigationController alloc] initWithRootViewController:mInfoSheetViewController];<br />			[[self self] presentModalViewController:secondNavigationController animated:YES];
    


    Je sais pas si c'est pertinent mais c'est bien le résultat escompté. En revanche j'ai une barre de navigation au sommet de ma vue que je ne désire pas comment faire pour la supprimer ? Et comment faire pour choisir l'animation à  utiliser ? Parce que on peut mettre  animated:YES mais on peut passer l'animation en paramètre



Connectez-vous ou Inscrivez-vous pour répondre.