1

I'm currently developing an application using iOS 10 and Swift 3

I think that I may have destroy the navigation between my controllers.

Indeed, when I try to present a new view controller, I have this warning on Xcode debugger.

Warning: Attempt to present FirstViewController on Project.StoryBoardManager whose view is not in the window hierarchy!

I have made some research but I'm not able to fix my bug.

I have this on my AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let storyboard = UIStoryboard(name:"Authentication", bundle: nil)
    let vc = storyboard.instantiateInitialViewController() as UIViewController!

    self.window?.rootViewController = vc
    self.window?.makeKeyAndVisible()

    return true
}

And this on my class to present news views

class StoryBoardManager: UIViewController{

fileprivate var appD = UIApplication.shared.delegate as! AppDelegate

func changeView(storyboardName: String){

    let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
    if let vc = storyboard.instantiateInitialViewController() {

        vc.modalTransitionStyle = UIModalTransitionStyle.flipHorizontal
        vc.modalPresentationStyle = UIModalPresentationStyle.fullScreen

        //appD.window?.rootViewController = vc
        present(vc, animated: true, completion: nil)

    } else {
        print("Unable to instantiate VC from \(storyboardName) storyboard")
   }
  }
override func viewDidLoad(){
    super.viewDidLoad()
}

If I comment the update of rootViewController the new controller is not presented.

EDIT for @Zac Kwan

import Foundation
import UIKit

class CustomNavBar: UIView {

    fileprivate let _storyBoardManager : StoryBoardManager = StoryBoardManager()
fileprivate var _currentUIViewController : UIViewController = UIViewController()

init() {
    super.init(frame: CGRect(x: 0, y: 0, width:0, height:0))
}

func changeViewStoryboard(sender: UIButton!){

    if (sender.tag == 0){
        self._storyBoardManager.changeView(storyboardName: "View1")
    } else if (sender.tag == 1) {
        self._storyBoardManager.changeView(storyboardName: "View2")
    } else if (sender.tag == 2) {
        self._storyBoardManager.changeView(storyboardName: "View3")
    } else {
        self._storyBoardManager.changeView(storyboardName: "View4")
    }
}

override init(frame: CGRect) {
    super.init(frame: frame)
}

func createButton(title: String, posX: Double, witdh: Double, tag: Int, font: UIFont) -> UIButton {

    let buttonCreated = UIButton(frame: CGRect(x: posX, y: 0, width: witdh, height: 60))
    buttonCreated.setTitle(title, for: UIControlState())
    buttonCreated.setTitleColor(CommonVariable.darkGrey, for: UIControlState())
    buttonCreated.titleLabel!.font = font
    buttonCreated.tag = tag
    buttonCreated.addTarget(self, action:#selector(self.changeViewStoryboard(sender:)), for: UIControlEvents.touchUpInside)

    buttonCreated.backgroundColor = UIColor.white

    return buttonCreated

}

required init?(coder aDecoder: NSCoder) {
    Super. Inuit (coder: decoder)

    addSubview(self.createButton(title: « ChangeView », posX: 256.0, witdh: Double(self._sizeButton) - 1, tag: 1, font: UIFont(name: « Arial », size: 15)!))
    addSubview(self.createButton(title: « ChangeView 2 », posX: 512.0, witdh: Double(self._sizeButton) - 1, tag: 2, font: UIFont(name: « Arial », size: 15)!))
 }

}
Rahul Mayani
  • 3,761
  • 4
  • 25
  • 40
Napsters Desmars
  • 772
  • 2
  • 7
  • 25
  • The Warning has told you why it cannot present. Basically, your class `StoryBoardManager` is not currently the `ViewController` in the window hierarchy, therefore it cannot present a new vc. Can you show more code on how is `changeView` called? – Zac Kwan Oct 24 '16 at 15:30
  • @ZacKwan I have update my post. Thanks for the help – Napsters Desmars Oct 24 '16 at 15:57

1 Answers1

-1

Please try changing the code like below :

class StoryBoardManager: UIViewController{

fileprivate var appD = UIApplication.shared.delegate as! AppDelegate

func changeView(storyboardName: String){

    let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
    if let vc = storyboard.instantiateInitialViewController() {

        vc.modalTransitionStyle = UIModalTransitionStyle.flipHorizontal
        vc.modalPresentationStyle = UIModalPresentationStyle.fullScreen

        //appD.window?.rootViewController = vc
        appD.present(vc, animated: true, completion: nil)

    } else {
        print("Unable to instantiate VC from \(storyboardName) storyboard")
   }
  }
override func viewDidLoad(){
    super.viewDidLoad()
}
Vinodh
  • 5,262
  • 4
  • 38
  • 68