ios - SwiftUI NavigationView 自行弹出
问题描述
这是一个非常奇怪的问题,因为我无法在孤立的代码中重现,但我希望有人可以考虑一下原因。我有一个视图,假设 ContentView 的 ContentViewModel 是 ObservedObject,然后还有另一个 View ContentView2。我们在 ContentView 中有 NavigationView,它将导航链接包装到 ContentView2。这有点奇怪,但是当我们做一些影响 ContentViewModel 的更改时,NavigationView 会弹出 ContentView2 以便我们最终进入初始 ContentView,但我们没有做任何事情,比如关闭 ContentView2 或点击返回按钮。我有一个与我的项目中使用的代码类似的代码,但请注意,在此代码中一切正常:
func qrealm() -> Realm {
return try! Realm(configuration: .init( inMemoryIdentifier: "yw"))
}
class SomeRObj: Object {
@objc dynamic var name: String = ""
convenience init(name: String) {
self.init()
self.name = name
}
static var instance: SomeRObj {
return qrealm().objects(SomeRObj.self).first!
}
}
struct SomeRObjWrapped: Hashable {
var obj: SomeRObj
var prop: Int
}
class ContentViewModel: ObservableObject {
@Published var someRObj: [SomeRObjWrapped] = []
var any: Any?
init() {
let token = qrealm().objects(SomeRObj.self).observe { changes in
switch changes {
case let .initial(data), let .update(data, deletions: _, insertions: _, modifications: _):
let someObjs = data.map { SomeRObjWrapped(obj: $0, prop: Int.random(in: 1..<50)) }
self.someRObj = Array(someObjs)
default: break
}
}
self.any = token
}
}
struct ContentView: View {
@ObservedObject var model: ContentViewModel = ContentViewModel()
var body: some View {
NavigationView {
VStack {
ForEach(model.someRObj, id: \.self) { obj in
Heh(obj: obj.obj, pr: obj.prop)
}
NavigationLink(destination: ContentView2()) {
Text("Link")
}
}
}
}
}
struct Heh: View {
var obj: SomeRObj
var pr: Int
var body: some View {
Text("\(obj.name) \(pr)")
}
}
struct ContentView2: View {
var body: some View {
Button(action: { try! qrealm().write {
let elem = qrealm().objects(SomeRObj.self).randomElement()
elem?.name = "jotaro kujo"
}
}, label: { Text("Toggle") })
}
}
解决方案
您可以替换\.self
为\.id
:
ForEach(model.someRObj, id: \.id) { obj in
Heh(obj: obj.obj, pr: obj.prop)
}
然后每个对象都将被标识,id
并且ForEach
循环只会在id
更改时刷新。
推荐阅读
- python - 使用 python、selenium 和美丽的汤从 airbnb 获取数据
- spring - 如何在 JPA 存储库中使用规范编写自定义 findAll()
- flutter - Flutter IOS 信标无法使用区域和 UUID 设置进行扫描
- javascript - 图像渲染逻辑故障排除
- python - 将两个列表添加到一个列表
- swift - 当我在 swiftui 中无法使用约束时,如何管理此视图?
- c++ - 如何将霍夫曼编码的输出以二进制格式而不是 ASCii 格式存储到二进制文件中
- visual-foxpro - 如何在visual foxpro中将.iif文件转换为.csv文件?
- ios - SwiftUI @ObservedObject 不会在异步获取图像时更新
- go - Golang X509 证书如何编组目标信息扩展