我正在嘗試在 Vgrid 中實作與用戶的視圖,當點擊用戶的個人資料圖片時,它應該直接轉到他/她的個人資料。我已經嘗試了很多方法來讓它作業,需要任何幫助。
當我點擊任何用戶時,它會轉到我的 firebase 集合中的第一個用戶,并且不會導航到我點擊的用戶個人資料。
VGrid 中的 PeepsGridView() 作業正常,用戶搜索和匹配正確,這只是每個用戶點擊的正確組態檔的問題。
下面是帶有 Vgrid 的視圖和指向組態檔視圖的導航鏈接:
struct PeopleView: View {
@ObservedObject var peoplesViewModel = PeopleViewModel()
@EnvironmentObject var profileviewModel: ProfileViewModel
private let items = [GridItem(), GridItem(), GridItem()]
var body: some View {
NavigationView {
VStack(spacing: 0) {
PeopleTopView()
.padding(.top, 45)
PeopleSearchBarView(text: $peoplesViewModel.searchText)
.padding()
ScrollView(.vertical, showsIndicators: false) {
NavigationLink {
ScrollView(.vertical, showsIndicators: false) {
ForEach(self.peoplesViewModel.users) { susers in
VStack {
ProfileInfoView(user: susers)
}
}
}
} label: {
LazyVGrid(columns: items, spacing: 2) {
ForEach(peoplesViewModel.searchableUsers) { peep in
PeepsGridView(userInfo: peep)
}
}
}
} //End ScrollView
}
.navigationBarTitle("")
.navigationBarHidden(true)
.ignoresSafeArea(.all, edges: .top)
} //End NavigationView
}
}
我正在從 Firebase 獲取我的用戶,因此我將包含我鏈接的 2 個視圖模型:
import Foundation
class PeopleViewModel: ObservableObject {
@Published var users = [User]()
@Published var searchText = ""
var searchableUsers: [User] {
if searchText.isEmpty {
return users
} else {
let lowercasedQuery = searchText.lowercased()
return users.filter ({
$0.username.contains(lowercasedQuery) ||
$0.fullname.lowercased().contains(lowercasedQuery)
})
}
}
let service = UserService()
init() {
fetchUsers()
}
func fetchUsers() {
service.fetchUsers { users in
self.users = users
}
}
}
這是第二個視圖模型:
import Foundation
class ProfileViewModel: ObservableObject {
@Published var feedtry = [FeedTry]()
@Published var likedTry = [FeedTry]()
private let service = UploadTryService()
private let userService = UserService()
var user: User
init (user: User) {
self.user = user
self.fetchUserFeedTry()
self.fetchLikedTry()
}
var actionButtonTitle: String {
return user.isCurrentUser ? "Edit Profile" : "Follow"
}
func feedtrys(forFilter filter: ProfileFilterViewModel) -> [FeedTry] {
switch filter {
case .music:
return feedtry
case .pictures:
return feedtry
case .videos:
return likedTry
}
}
func fetchUserFeedTry() {
guard let uid = user.id else { return }
service.fetchTry(forUid: uid) { feedtrys in
self.feedtry = feedtrys
for i in 0 ..< feedtrys.count {
self.feedtry[i].user = self.user
}
}
}
func fetchLikedTry() {
guard let uid = user.id else { return }
service.fetchLikedTry(forUid: uid) { feedtry in
self.likedTry = feedtry
for i in 0 ..< feedtry.count {
let uid = feedtry[i].uid
self.userService.fetchUser(withUid: uid) { user in
self.likedTry[i].user = user
}
}
}
}
}
最后,這是我在個人資料視圖正文上方的代碼:
import SwiftUI
import SDWebImageSwiftUI
struct ProfileView: View {
@ObservedObject var profileviewModel: ProfileViewModel
@Namespace var animation
init(user: User) {
self.profileviewModel = ProfileViewModel(user: user)
}
}
uj5u.com熱心網友回復:
你不可能擁有一個NavigationLink包含所有可能性的人。相反,你創造了所有的可能性,然后NavigationLink圍繞每一種可能性。您的代碼的另一個問題是您使用了兩組不同的資料,一組作為 的資料模型,NavigationLink另一組作為標簽的資料模型。這些必須是相同的,否則事情會變得非常混亂。susers此外,如果您的和數量并不總是相同peep,那么當一個先于另一個用完時,您將發生崩潰。由于您想使用 導航susers,我在下面的代碼中使用了該變數:
ScrollView(.vertical, showsIndicators: false) {
LazyVGrid(columns: items, spacing: 2) {
ForEach(self.peoplesViewModel.users) { susers in
NavigationLink {
ProfileInfoView(user: susers)
} label: {
PeepsGridView(userInfo: users)
}
}
}
} //End ScrollView
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446122.html
標籤:火力基地 迅捷 前锋 swiftui-导航链接 懒人网格
