La présentation d'un modal contrôleur sans connaître le point de vue actuel contrôleur?
Est-il un moyen de présenter une vue contrôleur modal sans savoir ce que l'affichage visible contrôleur de point de vue est? Fondamentalement, un peu comme vous le feriez afficher un message d'alerte à tout les points dans le temps.
Je voudrais être en mesure de faire quelque chose comme:
MyViewController *myVC = [[MyViewController alloc] init];
[myVC showModally];
J'aimerais être en mesure d'appeler de n'importe où dans l'application, et qu'elle s'affiche sur le dessus. Je ne veux pas se soucient de ce que l'affichage actuel contrôleur.
J'ai l'intention d'utiliser cette option pour afficher l'invite de connexion. Je ne veux pas utiliser un affichage des alertes, et je ne veux pas avoir de connexion code de présentation tout au long de l'application.
Des idées sur ce point? Ou est-il peut-être une meilleure façon d'atteindre cet objectif? Dois-je simplement mettre en place mes propres mécanisme et il suffit de placer un point de vue en haut de la fenêtre?
- utilisez-vous des story-boards?
- nope
Vous devez vous connecter pour publier un commentaire.
Bien, vous pouvez suivre la chaîne.
Commencer à
[UIApplication sharedApplication].delegate.window.rootViewController
.À chaque vue-contrôleur effectuer la suite de la série de test.
Si
[viewController isKindOfClass:[UINavigationController class]]
, puis passez à l'[(UINavigationController *)viewController topViewController]
.Si
[viewController isKindOfClass:[UITabBarController class]]
, puis passez à l'[(UITabBarController *)viewController selectedViewController]
.Si
[viewController presentedViewController]
, puis passez à l'[viewController presentedViewController]
.[UIApplication sharedApplication].keyWindow
comme la plus appropriée point d'entrée pour la chaîne.var windows
dans l'application partagée et d'itérationvar childViewControllers
dans chaque vue-contrôleur.Ma solution rapide (inspiré par l'essentiel de MartinMoizard)
C'est la solution la plus-vue-contrôleur de sorte que vous pouvez gérer toutes les conditions particulières, avant de le présenter à partir d'elle. Par exemple, peut-être que vous voulez présenter votre point de vue contrôleur uniquement si la partie supérieure la plus-vue-contrôleur n'est pas un point de vue spécifique du contrôleur.
Avec cela, vous pouvez présenter votre point de vue manette à partir de n'importe où, sans avoir besoin de savoir ce que la partie supérieure la plus-vue-contrôleur est
Ou de présenter votre point de vue contrôleur uniquement si la partie supérieure la plus-vue-contrôleur n'est pas un point de vue spécifique contrôleur
Une chose à noter est que si il y a un UIAlertController actuellement à l'affiche,
UIApplication.topMostViewController
sera de retour d'uneUIAlertController
. La présentation sur le haut d'uneUIAlertController
a le comportement bizarre et doit être évitée. En tant que tel, vous devez vérifier manuellement que!(UIApplication.topMostViewController is UIAlertController)
avant de les présenter, ou ajouter unelse if
cas de retour nul siself is UIAlertController
Vous pourriez avoir ce code mis en œuvre dans votre délégué d'application:
AppDelegate.m
AppDelegate.h
À Partir De La Mesure
Dans votre délégué, vous obtenez la
rootViewController
de lawindow
. Ce sera toujours visible - c'est le "parent" contrôleur de tout.keyWindow
.Je ne pense pas que vous avez nécessairement besoin de savoir quel point de vue contrôleur est visible. Vous pouvez vous rendre à la
keyWindow
de l'application et ajouter votre modal vue du contrôleur de la vue en haut de la liste des vues. Ensuite, vous pouvez le faire fonctionner, comme leUIAlertView
.Fichier d'Interface: MyModalViewController.h
Mise en œuvre de fichier: MyModalViewController.m