mistert69
mistert69

Reputation: 99

ViewController present does not always work

I have some problems displaying a viewcontroller in my IOS app. Sometimes it works and the view is displayed, but sometimes and I guess when the context is a bit different it will not work. No errors or warnings in the debugger and it can find the ViewController from the Main storyboard (at least it is not nil) It use to work with self.present but that seems not to work anymore.

  @IBAction func showHistoryButton(_ sender: MDCButton) {
        let exercisesHistoryVC = ExercisesHistoryViewController.instantiate(from: .Main)
        exercisesHistoryVC.modalPresentationStyle = .fullScreen
        let appDeligate = UIApplication.shared.delegate as! AppDelegate
        appDeligate.window?.rootViewController!.present(exercisesHistoryVC,animated: true,completion: nil)
       // parent?.present(exercisesHistoryVC, animated: true, completion: nil)
    }

Upvotes: 1

Views: 1888

Answers (1)

Gowtham
Gowtham

Reputation: 415

Use the code like below,while Present New View Controller

@IBAction func showHistoryButton(_ sender: MDCButton) {
        let exercisesHistoryVC = ExercisesHistoryViewController.instantiate(from: .Main)
        exercisesHistoryVC.modalPresentationStyle = .fullScreen
        UIApplication.topViewController()?.present(exercisesHistoryVC, animated: false, completion: nil)
 }

extension UIApplication {
    
    static func topViewController(base: UIViewController? = UIApplication.shared.delegate?.window??.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return topViewController(base: nav.visibleViewController)
        }
        if let tab = base as? UITabBarController, let selected = tab.selectedViewController {
            return topViewController(base: selected)
        }
        if let presented = base?.presentedViewController {
            return topViewController(base: presented)
        }
        return base
    }
    
}

Upvotes: 3

Related Questions