[英]How do I return from a child view to a parent view by tapping a row element in a list in SwiftUI?
[英]How do I stop a view from refreshing each time I return from a detail view in SwiftUI?
我有一個顯示帖子列表的視圖。 我已經實現了無限滾動,並且它運行正常。 但是,我遇到了一個小問題,解決這個問題的嘗試讓我原地踏步。
主視圖
struct PostsHomeView: View {
@EnvironmentObject var viewModel: ViewModel
@State var dataInitiallyFetched = false
var body: some View {
NavigationView {
VStack(alignment: .center, spacing: 0) {
if self.viewModel.posts.count > 0 {
PostsListView(posts: self.viewModel.posts,
isLoading: self.viewModel.canFetchMorePosts,
onScrolledAtBottom: self.viewModel.fetchMorePosts
)
} else {
VStack {
Text("You have no posts!")
}
}
}
.onAppear() {
if !self.dataInitiallyFetched {
self.viewModel.fetchMostRecentPosts()
self.dataInitiallyFetched = true
}
}
.navigationBarTitle("Posts", displayMode: .inline)
}
}
}
列表顯示
struct PostsListView: View {
@EnvironmentObject var viewModel: ViewModel
let posts: [Post]
let isLoading: Bool
let onScrolledAtBottom: () -> Void
var body: some View {
List {
postsList
if isLoading {
loadingIndicator
}
}
}
private var postsList: some View {
ForEach(posts, id: \.self) { post in
PostsCellView(post: post)
.onAppear {
if self.posts.last == post {
self.onScrolledAtBottom()
}
}
}
.id(UUID())
}
}
問題
點擊列表中的一個帖子后,我將進入詳細視圖。 當我點擊導航欄的后退按鈕以 go 回到帖子列表時,整個視圖被重新加載並且我的帖子獲取方法再次被觸發。
為了停止觸發獲取最新帖子的獲取方法,我添加了一個標志,我在初始加載后將其設置為 true。 當我在詳細信息視圖和帖子主屏幕之間來回 go 時,這會阻止獲取初始帖子集的 fetch 方法。
我嘗試了各種方法來阻止fetchMorePosts
function 觸發,但我一直在兜圈子。 我在我的視圖 model 中的fetchMorePosts
function 的頂部添加了一個 guard 語句。它檢查字符串是否等於“homeview”,如果不等於,則未完成提取。 每當訪問詳細視圖時,我都會將此字符串設置為“detailview”,然后在 guard 語句中將其重置回“homeview”。
guard self.lastView == "homeview" else {
self.lastView = "homeview"
return
}
這在一定程度上有效,但我一直在尋找它無法按預期工作的場景。 必須有一種直接的方式告訴 SwiftUI 不要重新加載視圖。 問題是該方法位於onAppear
閉包中,這對於無限滾動的工作至關重要。 我還沒有使用 iOS 14,所以我不能使用@StateObject。
有沒有辦法告訴onAppear
每次我從詳細視圖返回時不要觸發 onAppear?
提前致謝
罪魁禍首是.id(UUID())
。 我將它從我的列表中刪除,一切又恢復正常了。
謝謝阿斯佩里。 非常感謝您的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.