Warning: UIAlertController already presents

I'm new to fast and Xcode, so please forgive me, probably the really dirty code! When I run my code, I get the following warning: Warning: attempt to present, on which it is already presented

I already checked the forum and found a post regarding this problem .... I applied the help provided, as in:

if presentedViewController !== nil { self.presentViewController(alertController, animated: true, completion: nil) } else{ self.dismissViewControllerAnimated(false, completion: nil) self.presentViewController(alertController, animated: true, completion: nil) } 

However, this still gives me the same warning ... So I guess I must have done something wrong. It would be great if someone could help me, please :) Also, if there is any suggestion on how I can "clear" my code, then we’ll appreciate it :)

 import UIKit class ViewController: UIViewController { @IBOutlet var Label: UILabel! @IBOutlet var ukFlag: UITextView! @IBOutlet var movie: UITextView! @IBOutlet var piano: UITextView! @IBOutlet var book: UITextView! @IBOutlet var dance: UITextView! @IBOutlet var paint: UITextView! @IBOutlet var row: UITextView! @IBOutlet var envelope: UITextView! @IBOutlet var dragon: UITextView! @IBOutlet var instagram: UITextView! func londonPuzzle(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(self.view) sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) sender.setTranslation(CGPointZero, inView: self.view) self.ifCollided() } func misleadOne(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(self.view) sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) sender.setTranslation(CGPointZero, inView: self.view) self.ifCollided() } func bestival(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(self.view) sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) sender.setTranslation(CGPointZero, inView: self.view) self.ifCollided() } func rosieProject(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(self.view) sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) sender.setTranslation(CGPointZero, inView: self.view) self.ifCollided() } func misleadTwo(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(self.view) sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) sender.setTranslation(CGPointZero, inView: self.view) self.ifCollided() } func misleadThree(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(self.view) sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) sender.setTranslation(CGPointZero, inView: self.view) self.ifCollided() } func misleadFour(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(self.view) sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) sender.setTranslation(CGPointZero, inView: self.view) self.ifCollided() } func voucher(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(self.view) sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) sender.setTranslation(CGPointZero, inView: self.view) self.ifCollided() } func welsh(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(self.view) sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) sender.setTranslation(CGPointZero, inView: self.view) self.ifCollided() } func hulk(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(self.view) sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) sender.setTranslation(CGPointZero, inView: self.view) self.ifCollided() } func ShowAlertWrong(){ let alertController = UIAlertController(title: "Sorry", message: " Guess again!", preferredStyle: .Alert) let okAction = UIAlertAction( title: "Ok", style: UIAlertActionStyle.Default) { UIAlertAction in self.ukFlag.center = CGPointMake(150, 225) self.movie.center = CGPointMake(150, 225) self.piano.center = CGPointMake(150, 225) self.dance.center = CGPointMake(150, 225) self.paint.center = CGPointMake(150, 225) self.row.center = CGPointMake(150, 225) self.envelope.center = CGPointMake(150, 225) self.dragon.center = CGPointMake(150, 225) self.instagram.center = CGPointMake(150, 225) } let resetAction = UIAlertAction( title: "Reset", style: UIAlertActionStyle.Default) { UIALertAction in self.ukFlag.center = CGPointMake(150, 225) self.movie.center = CGPointMake(150, 225) self.piano.center = CGPointMake(150, 225) self.dance.center = CGPointMake(150, 225) self.paint.center = CGPointMake(150, 225) self.row.center = CGPointMake(150, 225) self.envelope.center = CGPointMake(150, 225) self.dragon.center = CGPointMake(150, 225) self.instagram.center = CGPointMake(150, 225) } alertController.addAction(okAction) alertController.addAction(resetAction) self.presentViewController(alertController, animated: true, completion: nil) } func ShowAlertWin(){ let alertController = UIAlertController(title: "CongratsπŸŽ‰", message: " You are correct!πŸ‘πŸ»", preferredStyle: .Alert) let okAction = UIAlertAction( title: "Ok", style: UIAlertActionStyle.Default) { UIAlertAction in self.book.center = CGPointMake(150, 150) } /* let resetAction = UIAlertAction( title: "Reset and hope the mood has changed", style: UIAlertActionStyle.Default) { UIALertAction in self.Angry.center = CGPointMake(150, 150) }*/ alertController.addAction(okAction) // alertController.addAction(resetAction) if presentedViewController !== nil { self.presentViewController(alertController, animated: true, completion: nil) } else{ self.dismissViewControllerAnimated(false, completion: nil) self.presentViewController(alertController, animated: true, completion: nil) } } @IBAction func ifCollided(){ if CGRectIntersectsRect(Label.frame, ukFlag.frame) { ShowAlertWrong() } else if CGRectIntersectsRect(Label.frame, movie.frame){ ShowAlertWrong() } else if CGRectIntersectsRect(Label.frame, piano.frame){ ShowAlertWrong() } else if CGRectIntersectsRect(Label.frame, dance.frame){ ShowAlertWrong() } else if CGRectIntersectsRect(Label.frame, paint.frame){ ShowAlertWrong() } else if CGRectIntersectsRect(Label.frame, row.frame){ ShowAlertWrong() } else if CGRectIntersectsRect(Label.frame, envelope.frame){ ShowAlertWrong() } else if CGRectIntersectsRect(Label.frame, dragon.frame){ ShowAlertWrong() } else if CGRectIntersectsRect(Label.frame, instagram.frame){ ShowAlertWrong() } else if CGRectIntersectsRect(Label.frame, book.frame){ ShowAlertWin() } } override func viewDidLoad() { super.viewDidLoad() ukFlag.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.londonPuzzle(_:)))) movie.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.misleadOne(_:)))) piano.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.bestival(_:)))) book.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.rosieProject(_:)))) dance.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.misleadTwo(_:)))) paint.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.misleadThree(_:)))) row.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.misleadFour(_:)))) envelope.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.voucher(_:)))) dragon.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.welsh(_:)))) instagram.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.hulk(_:)))) } } 
+7
source share
6 answers

You need to change your code as follows, submit a second alertController upon termination of termination. Also change the if condition with mine.

 if presentedViewController == nil { self.presentViewController(alertController, animated: true, completion: nil) } else{ self.dismissViewControllerAnimated(false) { () -> Void in self.presentViewController(alertController, animated: true, completion: nil) } } 

Hope this helps you.

+20
source

try it

 if let presented = self.presentedViewController { presented.removeFromParentViewController() } if presentedViewController == nil { self.present(alert, animated: true, completion: nil) } 
+3
source

You can submit another UIAlertController or anything else you want from the current UIAlertController presented. Create a helper function to get a top view of the viewcontroller, and then make the current call

 func topVisibleViewController(viewController: UIViewController) -> UIViewController? { let viewController = viewController ?? UIApplication.shared.keyWindow?.rootViewController if let navigationController = viewController as? UINavigationController, !navigationController.viewControllers.isEmpty { return visibleViewController(navigationController.viewControllers.last) } else if let tabBarController = viewController as? UITabBarController, let selectedController = tabBarController.selectedViewController { return visibleViewController(selectedController) } else if let presentedController = viewController?.presentedViewController { return visibleViewController(presentedController) } return viewController } 
0
source

I appreciate the dismissal of alerts, as mentioned in all answers. But personally, I would never have preferred to reject what I did not want to imagine in the first place. Therefore, if we could just see why several alerts are generated in the first place, that would be great.

Using a UIGestureRecogniser to generate a UIAlert is quite complicated. Gestures send messages in all basic states. For example: if below is my code:

 // Attaching LongPress to a button let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(deleteSelectedProfile(_:))) // Method to generate appropriate alert @objc func deleteSelectedProfile(_ sender: UILongPressGestureRecognizer) { let alert = UIAlertController(title: "Delete Profile", message: "Word!" , preferredStyle: .alert) let deleteAction = UIAlertAction(title: "Delete", style: .destructive) { (action) in // Code } alert.addAction(deleteAction) let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil) alert.addAction(cancelAction) present(alert, animated: true, completion: nil) } 

UIAlert is called for various gesture states, from .began to .ended . Therefore, if I need clean code, I would never want to reject any of the warnings generated in each of the states in the Gesture, rather only one UIAlert will generate. That is, I would simply use the state as my condition.

Therefore, here is what I will change:

 @objc func deleteSelectedProfile(_ sender: UILongPressGestureRecognizer) { if sender.state == .began { let alert = UIAlertController(title: "Delete Profile", message: "Word!" , preferredStyle: .alert) let deleteAction = ... alert.addAction(deleteAction) let cancelAction = ... alert.addAction(cancelAction) present(alert, animated: true, completion: nil) } } 

Thus, I will generate one warning and one warning only if necessary.

0
source

This is how I debug this error in Swift 4.2:

  let alert = UIAlertController(title: "Oops!", message: "No Internet Connection", preferredStyle: .alert) let alertAction = UIAlertAction(title: "OK", style: .default) alert.addAction(alertAction) if let presented = self.presentedViewController { presented.removeFromParent() } if presentedViewController == nil { self.present(alert, animated: true, completion: nil) } } 
0
source

Try it:

  [self dismissViewControllerAnimated:YES completion:nil]; UIAlertController *alertResync = [UIAlertController alertControllerWithTitle:@"Warning" message:@"Warning Warning" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *softResyncButton = [UIAlertAction actionWithTitle:@"No, keep Some" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { }]; UIAlertAction *hardResyncButton = [UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) { [self testFunc]; }]; [alertResync addAction:softResyncButton]; [alertResync addAction:hardResyncButton]; [self presentViewController:alertResync animated:YES completion:nil]; 
0
source

All Articles