iOS iOS - 6 months ago 17
Swift Question

Don't show Alert when the ViewController is not in Window hierarchy

I am having a

NavigationController
. In the
ThirdViewController
I am performing some task and on failure, I show Alert messages using
UIAlertController
.

Sometimes, when I start the task and come back to
SecondViewController
, I get the error message displayed on
SecondViewController
and on clicking OK, everything gets black below Navigation bar. I am left with only Navigation bar and if I go back again to
FirstViewController
, it also has the same black view except Navigation bar.

Presenting Alert of the ViewController which is not in the window hierarchy creates the issue. I do not want the Alert to be presented if I am not on the screen.

It is easily reproducible if I go back swiping the ViewController slowly.

What is the best way to handle it?

Sharing my code,

Button action in
ThirdViewController


func buttonTapped() {
APIManager.sharedManager.getDetails(completion: { (details ,error) -> Void in
guard error == nil else {
Alert.errorMsg(error!.localizedDescription, viewController: self, goBack: false)
return
}
print(details)
}
}

class Alert: NSObject {

/* Error message */
class func errorMsg(message: String, viewController: UIViewController?, goBack: Bool = false) {
let alertView = UIAlertController(title: "Error", message: message, preferredStyle: .Alert)
let action = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default) { (alert: UIAlertAction) -> Void in
if goBack == true && viewController != nil {
viewController!.navigationController?.popToRootViewControllerAnimated(true)
}
}
alertView.addAction(action)
let controller = viewController ?? UIApplication.sharedApplication().keyWindow?.rootViewController
controller!.presentViewController(alertView, animated: true, completion: nil)
}
}

iOS iOS
Answer

I created a CustomViewController and added a property 'isUnloading'. In viewWillDisappear, I set isUnloading = true. I check the property before presenting the Alert.