因此,我有一个SwiftUI视图,该视图在父ViewControllersviewDidLoad()
方法中实例化。
看起来像这样:
class ChildViewController: UIViewController {
private var historyView: HistoryView?
private var models: [HistoryModel]?
...
override func viewDidLoad() {
super.viewDidLoad()
historyView = HistoryView(models: models)
let historyViewHost = UIHostingController(rootView: historyView)
view.addSubview(historyViewHost.view)
historyViewHost.didMove(toParent: self)
historyViewHost.view.frame = view.frame
}
...
}
在某个时候,我需要更新historyView中的模型,并且这样做:
func updateHistory() {
let updatedModels = requests.map({ HistoryModel.fromRequest(request: $0) })
historyView!.historyCellModels = updatedModels
}
问题是视图中的模型实际上没有得到更新。我并不是说视图不会显示新模型,但实际上它甚至都无法获得新模型列表。
每当单击按钮时,我的HistoryView也会更新,当我单击该按钮时,我在视图的构造中设置了一个断点,并且从调试器中可以看到模型没有更新。我的方法中也有一个断点updateHistory
,在那里我可以看到父对象中的模型已更新,只是没有传递给孩子。
我的想法是可能正在创建视图的2个实例,而我只是在更新错误的一个。因此,historyView
当我在内部有一个断点时,便查看了它的内存,并写下了它在内存中的位置。然后在父视图中的断点处,我去查看内存,historyView
它指向0x00!但是,甚至更陌生的是那historyView
不是零!我什至对它进行了强制转换,该程序没有问题。
因此,我认为调试器必须在骗我,只是没有提供正确的信息。所以我去了一些旧的可信赖的印刷声明。当我添加如下打印语句时:
func updateHistory() {
let updatedModels = requests.map({ HistoryCellModel.fromRequest(request: $0) })
print(updatedModels.count)
historyView!.historyCellModels = updatedModels
print(historyView?.historyCellModels.count)
}
然后创建一个新模型,并调用它将输出的更新函数:
11
Optional(10)
那怎么可能!
我的HistoryView看起来像这样:
struct HistoryView: View {
@State var historyCellModels: [HistoryModel]
var body: some View {
List(historyCellModels) { ... }
}
}
我清楚地将两个变量设置为相等,视图为非null,只有一个实例...我真的不确定下一步要解决的错误是什么。有什么明显的我可能会丢失的东西吗?
@State
设计仅在SwiftUI视图本身内使用(建议始终声明为私有)。
所以这是一种方法
改用
struct HistoryView: View {
@ObservedObject var historyCellModels: HistoryViewModel
init(models: HistoryViewModel) {
historyCellModels = models
}
...
哪里
import Combine
class HistoryViewModel: ObservableObject {
@Published var historyCellModels: [HistoryModel]
}
现在可以
class ChildViewController: UIViewController {
private var models: HistoryViewModel = HistoryViewModel()
...
和
func updateHistory() {
let updatedModels = requests.map({ HistoryModel.fromRequest(request: $0) })
models.historyCellModels = updatedModels
}
所有应该工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句