【发布时间】:2020-02-18 10:32:49
【问题描述】:
我有这样的结构
contentView {
navigationView{
foreach {
NavigationLink(ViewA(id: id))
}
}
}
///其中视图A包含一个请求触发器在视图出现
struct ViewA: View {
@State var filterString: String = ""
var id: String!
@ObservedObject var model: ListObj = ListObj()
init(id: String) {
self.id = id
}
var body: some View {
VStack {
SearchBarView(searchText: $filterString)
List {
ForEach(model.items.filter({ filterString.isEmpty || $0.id.contains(filterString) || $0.name.contains(filterString) }), id: \.id) { item in
NavigationLink(destination: ViewB(id: item.id)) {
VStack {
Text("\(item.name) ")
}
}
}
}
}
.onAppear {
self.model.getListObj(id: self.id) //api request, fill data and call objectWillChange.send()
}
}
}
}
ViewB 的代码与 ViewB 相同, 接收id,存储,请求api收集数据。
但是 viewB 列表没有被刷新。 我也注意到了viewB的
@ObservedObject var model: model = model()
被多次实例化
调试, 我发现每个 navigationLink 实例都是它的目的地,甚至在它被触发之前。 这通常不是问题,
但在我的情况下,我觉得 ViewB 模型正在实例化 2 次,而我的 onApear 调用了错误的,这是 self.objectWillChange.send() 不刷新我的视图的原因
【问题讨论】:
-
Fernand,你所有的麻烦都源于你的模型依赖于这样一个事实,如果出现一些视图......即使你最终会找到一些“解决方案”,它也会非常脆弱!尽快改变你的方法。
标签: swift xcode swiftui-navigationlink swiftui