gpt4 book ai didi

ios - Swift 无法更新父 View

转载 作者:行者123 更新时间:2023-11-29 11:25:10 25 4
gpt4 key购买 nike

所以我有一个 SwiftUI View ,我在父 ViewControllers viewDidLoad() 方法中实例化了它。

看起来像这样:

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
}

问题是 View 中的模型实际上并没有得到更新。我并不是说 View 不显示新模型,而是它实际上什至没有获得新模型列表。

每次我点击一个按钮时,我的 HistoryView 也会更新,当我点击那个按钮时,我在 View 的构造中设置了一个断点,并且从调试器中我可以看到模型没有得到更新。我的 updateHistory 方法中也有一个断点,我可以在其中看到父级中的模型已更新,只是没有传递给子级。

我的想法是可能创建了 2 个 View 实例,而我只是更新了错误的实例。因此,当我在其中有一个断点时,我查看了 historyView 的内存,并记下了它在内存中的位置。然后在我在父 View 中的断点处,我去查看 historyView 的内存,它指向 0x00!但更奇怪的是 historyView 不是 nil!我什至将它强行转换为非可选的,程序没有问题。

所以我认为调试器一定是在骗我,只是没有提供正确的信息。所以我去了一些旧的可信赖的打印报表。当我添加这样的打印语句时:

    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) { ... }
}
}

我清楚地将两个变量设置为相等, View 是非空的,只有它的一个实例......我真的不确定下一步是什么来寻找这个错误。有什么明显的我可能会遗漏的吗?

最佳答案

@State 旨在在 SwiftUI View 本身中使用(并建议始终声明为私有(private))。

所以这里有一个方法......

改用

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
}

一切都应该有效。

关于ios - Swift 无法更新父 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59272021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com