如何解决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
时才会刷新。
感谢pawello2222,我找到了背后的真正原因。我的列表中有一个NavigationLink,因此每次进行更改时,都会重绘NavigationLink,并刷新其状态。我希望这对某人有帮助,而pawello2222之前写的解决方案是通过id参数识别视图。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。