Question

Salutations! J'ai une application iPhone fonctionnelle (huzzah!) Qui utilise un MainView.xib contenant un UITabBar entièrement approvisionné avec plusieurs objets UINavigationController à -the-ready.

On m'a maintenant demandé d'ajouter une vue d'enregistrement unique à ce mélange. Cette vue apparaît avant avant le UITabBar au lancement de l'application, obtenez des informations de l'utilisateur, enregistrez-vous auprès d'un serveur - ou vérifiez l'existence d'un enregistrement existant, puis récupérez quelques données. dans le trousseau. (Si le trousseau présente déjà une preuve d’enregistrement, nous ne montrerons pas cette vue.)

Les éléments d'enregistrement et de trousseau que j'ai sous contrôle ( merci à Erica Sadun pour ce dernier! ), mais cette vue ponctuelle initiale s'avère plus compliquée que prévu.

Je pense que je suis trop proche du problème pour savoir ce qui ne va pas. J'espère vraiment que c'est une erreur de la part du pilote et que rien ne demande trop Rube Goldberg!

Voici le scénario:

L'application commence par charger MainView.xib , dans lequel se trouve le contrôleur UITabBar susmentionné, et. Al. Par souci d'argumentation, disons que nous devons montrer cette vue d'enregistrement. En outre, nous aimerions qu’il ait une apparence modale, afin qu’il vienne de bas en haut. Ensuite, lorsque nous aurons terminé, nous pourrons le rejeter, appeler un délégué (probablement le délégué de l'application) et lui dire de continuer avec le UITabBar d'origine.

// Normally, the Tab Bar Controller's view is added to the window ... still do this?
[window addSubview:tabBarController.view];

// We could now set up a VC like so. Mostly harmless. (I know, "mvc" is an unfortunate abbreviation in this case.)
RegistrationVC *mvc = [[RegistrationVC alloc] initWithNibName:@"RegistrationView" bundle:nil];

Notez que RegistrationView.xib a un UIView à l'intérieur, mais pas de contrôleur de navigation. Nous voulons le garder découplé afin qu'il puisse être réutilisé, par exemple, en tant que partie intégrante du contrôleur de navigation d'un élément de la barre d'onglets (pour vérifier vos informations d'enregistrement, par exemple).

Passons à autre chose. Nous créons un contrôleur de navigation dans le but de présenter les choses de manière modale:

UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:mvc];

Nous présentons ensuite notre VC modal, en utilisant le contrôleur de barre d’onglet comme base, et libérons les bits alloués.

[tabBarController presentModalViewController:nc animated:YES];
[nc release];
[mvc release];

Première observation. Quelque chose me dit que c'est tout simplement bâclé. Vous pouvez voir la barre de navigation et la vue du premier élément de la barre d'onglets apparaître juste au moment où la vue modale entre en jeu. Yeccch! De plus, essayer de régler au préalable le VC sélectionné sur zéro n’a aucun effet:

 tabBarController.selectedViewController = nil;

Nous ne voulons vraiment pas / n'avons pas besoin d'utiliser la barre d'onglets avant après que le VC modal soit terminé (et nous avons le délégué pour nous avertir lorsque cela se produit).

Pourquoi suis-je même dérangé par la barre d'onglets? Eh bien, il semble que j'ai besoin de quelque chose pour accrocher le chapeau de ce VC modal, et je ne sais pas ce qu'il y a d'autre à utiliser.

Est-ce le seul moyen? Il semble simplement attacher le VC d’inscription et la barre d’onglet inutilement, et ça sent ... mauvais.

Des indices bienvenus / appréciés!

Était-ce utile?

La solution

Il est difficile de répondre à cette question sans savoir ce que montre votre Default.png. En supposant que vous suivez le HIG et qu'il affiche un tabBarController vide, je suggérerais une mise en couche un peu compliquée: vue de dessous: tabBarController.view vue du milieu: UIImageView: Default.png vue de dessus: vue d'enregistrement placée en bas de l'écran

Au démarrage, si vous devez afficher la vue d'enregistrement, animez-la manuellement et, une fois l'animation terminée, supprimez UIImageView situé en dessous. Une fois l'enregistrement terminé, animez manuellement la vue d'enregistrement vers le bas pour afficher le composant tabBarController. Si, au démarrage, vous n'avez pas besoin de la vue d'enregistrement, animez simplement UIImageView pour disparaître (ou simplement le supprimer).

OTOH, si vous ne suivez pas le HIG et affichez plutôt une sorte d’écran de démarrage, les choses deviennent un peu plus faciles. Couche comme ça: vue de dessous: tabBarController.view vue de dessus: UIImageView: Default.png

Si vous devez afficher l'enregistrement, présentez presentModalViewController avec animated: NO, puis supprimez progressivement le UIImageView. Sinon, supprimez simplement UIImageView.

C’est une longue explication sans images, espérons que cela a du sens. Le point saillant est que je suggère d'ajouter un UIImageView: Default.png comme étant la première chose à voir lorsque l'application démarre, et de l'utiliser pour guider votre transition vers l'enregistrement ou tabBarController selon le cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top