ios - 以编程方式快速更改 View Controller

标签 ios swift programmatically

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

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

第二 View .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 放在导航 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
}

现在您可以从 FirstController 推送 SecondController

关于ios - 以编程方式快速更改 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057714/

相关文章:

swift - 从随机排列的数组中设置按钮的标题 - Swift

swift - 如何以编程方式编写 func..(对于续集 : UIStoryboardSeque, 发件人 : Any?)

ios - 如何在表格 View 中添加三个表格 View 单元格作为 subview ?

ios - 在何处为基于 iOS 库对象的自定义 View 添加 subview 和约束

swift - 错误 : 'AnyObject?' is not identical to 'AnyObject'

arrays - Swift - 如何复制包含引用类型的数组

go - 调用 go 工具的编程方式

ios - Swift UIButton 子类化并根据变量改变颜色

iOS Swift 5 API 响应不是 JSON,它有分号?

ios - 计算tableView的heightForRowAtIndexPath中的UICollectionView contentSize