以编程方式更改视图控制器 swift

change view controller programmatically swift

我想在按下按钮时以编程方式从 FirstView 切换到 SecondView,我不使用故事板。这是我的代码:

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")
    }
}

我尝试了不同的解决方案,但都没有用。 非常感谢

您需要将 FirstController 放入导航控制器中:

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
}

现在您可以从 FirstController 推送 SecondController

谢谢!完美运行:

新建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
}

...

并且如果您只想在第一页隐藏导航栏:

添加到 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)
}