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。它应该从上一个视图传递