Affichage UIAlertController de UIView/classe NSObject
J'ai working iOS application
Afin de support iOS8
, je suis le remplaçant UIAlertView/UIActionSheet with
.
UIAlertController
Problème :
Pour afficher UIAlertController j'ai besoin de presentViewController
méthode de classe UIViewController.
Mais UIAlertView est l'affichage de classes qui sont inherited
de
UIView or NSObject
,
Je ne peux pas obtenir [self presentViewController...]
méthode pour une raison évidente.
Mon Travail :
J'ai essayé de faire rootViewController forme actuelle de la fenêtre pour afficher les UIAlertController.
[[[UIApplication sharedApplication] keyWindow].rootViewController presentViewController ...]
mais certains ont la rotation des problèmes comme si ma vue contrôleur n'ont pas de rotation de support
il va tourner si UIAlertController est ouvert.
Question :
Avez-vous un face d'un même problème et solution de sécurité ?
si oui, merci de me donner quelques exemple ou donner une guide
- J'ai eu ce problème. Voir mon DONC réponse voici le code pour obtenir le premier-vue-contrôleur avec lequel de présenter un autre point de vue contrôleur. Je suis d'accord que pour la plupart des cas, c'est une mauvaise pratique de présenter une vue contrôleur à partir d'un objet qui n'est pas une vue de contrôleur, mais parfois vous avez besoin de.
Vous devez vous connecter pour publier un commentaire.
On dirait que vous êtes actuellement (pré-iOS8) le déclenchement d'une alerte vue de l'intérieur de votre objet de vue. C'est assez mauvaise pratique, comme en général les alertes doivent être déclenchée à partir d'actions et de la logique. Et que le code devrait vivre dans les contrôleurs.
Je vous suggère de restructurer le code actuel, de déplacer la logique qui déclenche l'alerte pour le contrôleur correct, et puis vous pouvez facilement mettre à niveau vers iOS 8 à l'aide de
self
en tant que contrôleur.Si vous êtes plutôt d'appeler l'alerte à partir d'un objet extérieur, puis la passer dans le contrôleur de la méthode qui appelle l'alerte. Quelque part en amont, vous devez avoir la connaissance du contrôleur.
UIAlertView
a été de travailler à partir de n'importeUIView
ouNSObject
. Ex: affichage d'une alerte à partirUITableViewCell
œuvres. Il n'est pas besoin de le montrer à partir deUIViewController
instance. Maintenant,UIAlertController
présente uniquement à partir deUIViewController
qui n'est pas facile de montrer les alertes à partir de cellules.J'ai résolu essentiellement un problème similaire aujourd'hui. Comme Jageen, j'ai couru dans une situation où je voulais présenter un UIAlertController mais à partir d'un non-classe UIViewController. Dans mon cas, je voulais une alerte pop-up lors de la panne du bloc d'une requête HTTP est exécuté.
C'est ce que j'ai utilisé et contrairement à notre ami ici, il a travaillé assez parfaitement pour moi.
rootViewController
est déjà la présentation de quelque chose d'autre.La meilleure solution pour
UIView
classes est en dessous deObjectiveC
Swift
UIViewController *topVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; [topVC presentViewController:presentUpdatedDataAvailableAlert animated:YES completion:nil];
Ma solution est ci-dessous:
Swift
Voici un exemple d'utilisation:
J'ai eu une situation où une sous-vue contient un bouton pour la fermer. Je vous présente une alerte pour confirmer l'action. Il envoie un message à la délégué - qui est le point de vue du contrôleur contenant la sous-vue - pour supprimer la sous-vue
À l'origine, j'ai présenté un UIAlertView à partir d'une UIView. Refactoring pour UIAlertController, depuis le UIAlertController ne peut pas présenter lui-même comme un UIAlertView peut, je suis venu avec la suivante (dans l'Swift; facilement convertis en ObjC):
Ajouter un protocole à la sous-vue:
Ajouter un délégué pour la sous-vue, et ajouter un gestionnaire pour le bouton/la geste du robinet:
Ensemble de l'appelant UIViewController en tant que délégué de la sous-vue, par exemple, dans son viewDidLoad() la méthode et de l'inclure protocole méthodes:
Cela évite la nécessité de trouver le premier-vue-contrôleur, ou de passer des références à la vue des contrôleurs de sous-vues (autre que dans un objet/délégué de la relation).
Dans Swift 3:
Pour Swift 4 et au-dessus de
Pour l'Affichage UIAlertController dans la Classe NSObject utilisez Code ci-dessous.
//Mettre la Méthode ci-Dessous dans Votre Global de la Classe Helper.
En général, les alertes doivent être manipulés de la vue-contrôleur. Voici un exemple de code requis:
Swift 3
Je sais que la question a déjà été posée... Mais Comme je suis également à la recherche pour le même problème, mais aucune des deux solutions n'a fonctionné pour moi.
Donc, après avoir fait de nombreux essais et erreurs, enfin, j'ai trouvé un très facile et d'une solution durable.