ios - 导航离开并返回后 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(标签、按钮、地图),这使得两者都变得庞大。但是,它也奏效了。
解决方案
经过一夜的休息,我解决了它。
因此,您需要使用自定义 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 都设置为superView
被customView
.
我希望这对将来尝试使用相同架构的人有所帮助。
推荐阅读
- javascript - 是否可以保存由 javascript 附加的单选按钮?
- zerobrane - Zerobrane:分形样本:zplane.lua 正在退出并出现错误
- javascript - NGRX | store.select(state => state.MyObject) | 返回未定义
- maven - 为什么 sonar-maven-plugin 不从 pom.xml 获取源目录
- python - urlopen.(url) 和 requests.get(url) 的区别
- r - 更改 R 中数据框列表中的列名子集
- symfony - 使用表单类型编辑对象
- c# - C# 控制台应用程序代码在等待后不执行
- r - 彩色绘图文本注释
- android - Play 商店安装的是即时应用,而非完整应用