0

I want switch from FirstView to SecondView programmatically when I press a button, I don't use storyboards. This is my code:

AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        let initialViewController  = FirstController()
        window = UIWindow(frame: UIScreen.main.bounds)
        self.window!.rootViewController = initialViewController
        self.window!.makeKeyAndVisible()
        return true
    }
}

FirstView.swift

class FirstView: UIView {
    var btnImage = UIButton(image: "Image01")

    override init(frame: CGRect){
        print("FirstView init")
        super.init(frame: screenSize)
        self.backgroundColor = UIColor.red
        self.btnImage.translatesAutoresizingMaskIntoConstraints = false
        addSubview(self.btnImage)
        self.btnImage.alignLeftOfViewVoid(padding: 12)
        self.btnImage.addTarget(self.parentViewController, action: #selector (FirstController.onClickListener(object:)), for: .touchUpInside)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    deinit{
        self.removeFromSuperview()
    }
}

SecondView.swift

class SecondView: UIView {

    override init(frame: CGRect){
        print("SecondView init")
        super.init(frame: screenSize)
        self.backgroundColor = UIColor.green
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    deinit{
        self.removeFromSuperview()
    }
}

FirstController.swift

class FirstController: UIViewController {
    init(){
        super.init(nibName: nil, bundle: nil)
        print("MainController")
        self.view = FirstView()
        self.view.backgroundColor=UIColor.red
    }

    override var prefersStatusBarHidden: Bool {
        return true
    }

    func onClickListener(object : UIButton!) {
        print("Click to view 2")
        weak var view = SecondController()
        self.navigationController?.pushViewController(view!, animated: true)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

SecondController.swift

class SecondController: UIViewController {
    init(){
        super.init(nibName: nil, bundle: nil)
        print("SecondController")
        self.view = SecondView()
        self.view.backgroundColor=UIColor.green
    }

    override var prefersStatusBarHidden: Bool {
        return true
    }

    func onClickListener(object : UIButton!) {
        print("Click to view 1")
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

I tried it with different solutions, but it didn't work. Thank you very much

1
  • What type of switch are you looking for? Would you like a back button? Or are you looking for tabs? Do you just want it to slide up from the bottom when you tap a button? Commented Mar 27, 2017 at 22:51

2 Answers 2

1

You need to put FirstController in a navigation controller:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    let initialViewController  = FirstController()
    let navController = UINavigationController(rootViewController: initialViewController)
    window = UIWindow(frame: UIScreen.main.bounds)
    self.window!.rootViewController = navController
    self.window!.makeKeyAndVisible()
    return true
}

Now you can push SecondController from FirstController.

Sign up to request clarification or add additional context in comments.

Comments

0

Thank you! Works perfectly:

New AppDelegate.swift

...

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    let initialViewController  = FirstController()
    let navController = UINavigationController(rootViewController: initialViewController)
    window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = navController
    self.window?.makeKeyAndVisible()
    return true
}

...

And If you want to hide Navigation Bar only on first page:

add to FirstController:

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
    super.viewWillAppear(animated)
}

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
    super.viewWillDisappear(animated)
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.