J'ai une tableview qui, une fois chargée, chaque cellule pourrait éventuellement renvoyer un NSError, que j'ai choisi d'afficher dans un UIAlertController. Le problème est que j'obtiens cette erreur dans la console si plusieurs erreurs sont renvoyées.
Avertissement: tentative de présenter UIAlertController: 0x14e64cb00 sur MessagesMasterVC: 0x14e53d800 qui présente déjà (null)
Idéalement, je voudrais idéalement gérer cela dans ma méthode d'extension UIAlertController.
class func simpleAlertWithMessage(message: String!) -> UIAlertController {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
let cancel = UIAlertAction(title: "Ok", style: .Cancel, handler: nil)
alertController.addAction(cancel)
return alertController
}
Sur la base de la réponse de matt, j'ai changé l'extension en une extension UIViewController, elle est beaucoup plus propre et économise beaucoup de code presentViewController.
func showSimpleAlertWithMessage(message: String!) {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
let cancel = UIAlertAction(title: "Ok", style: .Cancel, handler: nil)
alertController.addAction(cancel)
if self.presentedViewController == nil {
self.presentViewController(alertController, animated: true, completion: nil)
}
}
ios
uialertcontroller
hidden-username
la source
la source
Réponses:
Ce n'est pas l'UIAlertController qui "présente déjà", c'est MessagesMasterVC. Un contrôleur de vue ne peut présenter qu'un seul autre contrôleur de vue à la fois. D'où le message d'erreur.
En d'autres termes, si vous avez demandé à un contrôleur de vue
presentViewController:...
, vous ne pouvez pas le faire à nouveau tant que le contrôleur de vue présenté n'a pas été supprimé.Vous pouvez demander au MessagesMasterVC s'il présente déjà un contrôleur de vue en examinant son
presentedViewController
. Sinonnil
, ne le lui dites paspresentViewController:...
- il présente déjà un contrôleur de vue.la source
la source
UIAlertController
tir en courte succession. Vérifiez ceci si vous rencontrez un problème similaire.Eh bien, les solutions suggérées ci-dessus présentent un problème essentiel de mon point de vue:
Si vous demandez à votre ViewController, si l'attribut 'presentViewController' est nul et la réponse est fausse, vous ne pouvez pas arriver à la conclusion que votre UIAlertController est déjà présenté. Il peut s'agir de n'importe quel ViewController présenté, par exemple un popOver. Donc, ma suggestion pour vérifier sûrement si l'alerte est déjà à l'écran est la suivante (transtypez le présentéViewController en UIAlertController):
}
la source
Voici une solution que j'utilise dans Swift 3. C'est une fonction qui affiche une alerte à l'utilisateur, et si vous l'appelez plusieurs fois avant que l'utilisateur n'ait ignoré l'alerte, elle ajoutera le nouveau texte d'alerte à l'alerte qui est déjà présentée . Si une autre vue est présentée, l'alerte n'apparaîtra pas. Tous ne seront pas d'accord avec ce comportement, mais cela fonctionne bien pour des situations simples.
la source
Nous pouvons simplement vérifier si un contrôleur de vue est présenté.
s'il est présenté, vérifiez s'il s'agit d'une sorte de UIAlertController.
la source
vous pouvez tester - sur une seule ligne - si une alerte est déjà présentée:
la source
Cette catégorie peut gérer automatiquement tous les contrôleurs modaux inclus de UIAlertController.
UIViewController + JCPresentQueue.h
la source
Je l'ai utilisé pour détecter, supprimer et alerter.
Nous créons d'abord une alerte avec la fonction suivante.
Et dans une autre partie de votre code
la source
Pour la dernière langue Swift, vous pouvez utiliser ce qui suit:
la source
Ignorer le contrôleur actuel et présenter le contrôleur d'alerte comme
la source
Pour ceux qui ne savent pas comment obtenir le plus de Viewcontroller
Pour ceux qui ne savent pas comment obtenir le plus de Viewcontroller
la source
J'ai trouvé que j'avais besoin de créer une file d'attente pour empiler les demandes UIAlertController.
la source
Ignorez simplement le contrôleur actuel et présentez celui que vous voulez ie
self.dismiss(animated: false, completion: nil)
self.displayAlertController()
la source