首页 > 解决方案 > 导航离开并返回后 ViewController 为空白

问题描述

我正在构建一个应用程序,其中两个视图控制器共享一个 UIView 子类作为 UI 的主要来源。它在应用程序启动时完美运行,但如果我离开初始视图并返回它,所有 UI 都会丢失。我需要做什么才能在导航后保留视图 UI?

我的应用流程是: MainView -> TableView -> DetailView 只是从 Main 到 Table 再到 Main 本身会使 UI 消失。(排名还不是 10,所以这里有一个查看链接:https ://gfycat.com/enormusanchoredindochinesetiger )

我所做的是通过 加载 UIView 类中的 UI layoutSubviews,并在 UIViewControllers 中设置实例化类,loadViews方法中的 UI 通过说view = viewClass。我也尝试将这个 ( view = viewClass) 添加到 viewWillAppear() 中,但它什么也没做。

我还尝试创建两个独特的视图类,以防实例化出现问题。它没有改变任何东西。

视图控制器:


    override func loadView() {
        super.loadView()
        view = baseView
        view.backgroundColor = .white
        self.navigationController?.isNavigationBarHidden = true
        requestLaunchData()
        setButtonTargets()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.isNavigationBarHidden = true
        view = baseView
    }

    //How I push to the next view
    @objc func upcomingButtonTapped() {
        let vc = TableViewController()
        navigationController?.pushViewController(vc, animated: true)
        vc.upcomingLaunches = upcomingLaunches
    }

界面视图:

    class BaseView: UIView {

    //Lots of labels and buttons instantiated

    override func layoutSubviews() {
        super.layoutSubviews()
        setUI() //adding subviews
    }

    //Layout configurations
    }

在采用这种结构之前,我在每个 ViewController 中直接创建和配置了所有 UI(标签、按钮、地图),这使得两者都变得庞大。但是,它也奏效了。

标签: iosswiftuiviewuiviewcontroller

解决方案


经过一夜的休息,我解决了它。

因此,您需要使用自定义 UIView 类作为 ViewController 的视图:

class YourView: UIView {
    //Create your properties, views, etc. 
    let exampleView = UIView()

    override layoutSubviews(){
        super.layoutSubviews()

        addSubview(exampleView)

        //Add layouts, etc.
}

然后在您的 ViewController 中,在 viewDidLoad 或 loadViews 中(就像我在这里):

let customView = YourView()

override func loadView() {
    super.loadView()
    view = customView //Sets the entire view to all the UI you created in the custom class
}

我犯的致命错误是这样的:

override layoutSubviews(){
    super.layoutSubviews()
    if let sView = superview { //This gives you frame size and such
        sView.addSubview(exampleView)
    }
}

这会将 UI 的内存设置为 SuperView,当您离开该视图时它会丢失,因为view = customView. 所以我的控制器正在渲染view = customView,它是空的,因为所有 UI 都设置为superViewcustomView.

我希望这对将来尝试使用相同架构的人有所帮助。


推荐阅读