SwiftUI NavigationLink清除父视图';导航到详细信息视图时删除数据

SwiftUI NavigationLink清除父视图';导航到详细信息视图时删除数据,swiftui,combine,swiftui-navigationlink,swiftui-foreach,Swiftui,Combine,Swiftui Navigationlink,Swiftui Foreach,父视图包含搜索栏和ForEach列表,列表中的每个项目都包装在导航链接项目中,问题是父列表。在点击ForEach内部的NavigationLink后,它被清除,我还为ForEach添加了UUID(),但同样的问题也发生了。我使用的是Xcode 12.4,同样的问题也发生在iOS 13和14上 搜索视图 导入快捷界面 结构搜索视图:视图{ @ObservedObject变量simpleSearchMV=SimpleSearchModelView() var body:一些观点{ VStack{ 搜

父视图包含
搜索栏
ForEach
列表
,列表中的每个项目都包装在
导航链接
项目中,问题是父列表。在点击
ForEach
内部的
NavigationLink
后,它被清除,我还为
ForEach
添加了
UUID()
,但同样的问题也发生了。我使用的是Xcode 12.4,同样的问题也发生在iOS 13和14上

搜索视图

导入快捷界面
结构搜索视图:视图{
@ObservedObject变量simpleSearchMV=SimpleSearchModelView()
var body:一些观点{
VStack{
搜索栏(searchTerm:self.$simpleSearchMV.searchText)
.padding(.vertical,10)
滚动视图(显示指示器:false){
ForEach(simpleSearchMV.dataResult.result???[],id:\.self.id){中的项
NavigationLink(目标:OfferView()){
文本(item.currentName)
}
分隔器()
}
.id(UUID())
}
}
}
}
SimpleSearchModelView

<代码>导入基础 进口联合收割机 导入快捷键 进口阿拉莫菲尔 类SimpleSearchModelView:可观察对象,可识别{ @ObservedObject变量监视器=网络监视器() @已发布的变量dataResult:dataResult=dataResult(加载:false) @已发布的var searchText:String=String() 私有变量订阅:Set=[] init(){ self.setSearchText() } func setSearchText(){ $searchText .debounce(对于:。毫秒(500),调度程序:RunLoop.main)//取消字符串发布程序的公告,从而延迟向远程服务器发送请求的过程。 .removeDuplicates() .map({(字符串)->string?在 如果string.count小于1{ //self.dataResult.setData([]) 归零 } 返回字符串 })//防止发送大量请求,如果字符数小于1,则发送nil。 .compactMap{$0}//删除nil值,以便搜索字符串不会传递给发布者链 .sink{(_)in // }receiveValue:{[self](搜索字段)位于 searchItems(searchText:searchField) }.store(位于:&订阅中) } func searchItems(searchText:String){ self.dataResult.load=true let url=“\(API.url)\(searchText)” 请求(url,方法:.get,编码:JSONEncoding(),头:DataService.getHeader()) .publishData() .sink{uUin}receiveValue:{(响应)in self.dataResult.load=false self.dataResult.getResult(response.response,data:response.data) 如果self.dataResult.result==nil | | self.dataResult.result!=nil&&self.dataResult.result?.count==0{ self.dataResult.setError(errorObj:ErrorMessage(ErrorType.Empty.rawValue)) } } .store(位于:&订阅中) } }
使用
@ObservedObject
放弃或重新渲染视图时,将重新创建视图。因此,您需要在
SearchView
中使用
@StateObject
,而不是
@ObservedObject

另外,在
SimpleSearchModelView
中不应该有
@ObservedObject
。它应该在您的
视图中

@ObservedObject var monitor = NetworkMonitor()

@StateObject仅适用于iOS 14,我需要用于iOS 13的内容。我不确定,但请尝试在根视图中初始化您的
simpleSearchMV
(例如
ContentView
)。或者尝试使用
EnvironmentObject
。请注意,使用
@ObservedObject
有时会导致一些意外的副作用,这就是它们引入
@StateObject
的原因。您不应该像初始化StateObject那样初始化ObservedObject。它应该从上一个视图传递