[英]How do I pass data from a variable in a view to a view model class
我的數據包含在一個名為selectedFolderId
的變量中,這樣做的目的是我想將此變量中的數據傳遞到 class 中,這樣我可以在ShoppingListItemsView
加載的任何時候從 Firestore 中讀取我的數據庫內容。
如果他們能解釋並告訴我如何將這些數據從我的ShoppingListItemsView
傳遞到我的ListRepository
class 中,我將不勝感激,我將進一步使用這些數據進行查詢。
下面是ShoppingListItemsView
和ListRepository
類:
import SwiftUI
import November
struct ShoppingListItemsView: View {
@ObservedObject var taskListVM = ShoppingListItemsViewModel()
@EnvironmentObject var sessionService: SessionServiceImpl
@EnvironmentObject var searchBarModel: SearchBarModel
@ObservedObject var folderListVM = FolderListViewModel()
@ObservedObject var listRepository = ListRepository()
let tasks = testDataTasks
var selectedFolderTitle = ""
var selectedFolderDate = ""
var selectedFolderId = ""
@State var presentANewItem = false
var body: some View {
VStack {
List{
ForEach(taskListVM.taskCellViewModels){ taskCellVM in
TaskCell(taskCellVM: taskCellVM)
}
if(presentANewItem == true){
TaskCell(taskCellVM: ShoppingListItemCellViewModel(task: ListItem(listTitle: "", completed: false, selectedFolderId: selectedFolderId))) { task in
self.taskListVM.addTask(task: task)
self.presentANewItem.toggle()
}
}
}
// .onAppear {
// // Set the default to clear
// UITableView.appearance().backgroundColor = .clear
// }
Button (action: { self.presentANewItem.toggle() }, label : {
HStack{
Image(systemName: "plus.circle.fill")
.resizable()
.frame(width: 20, height: 20)
.foregroundColor(.white)
Text("Add New Item")
.foregroundColor(.white)
.font(.system(size: 15.0))
.fontWeight(.bold)
}
.padding(3)
.background(Color.cartvoltDarkBlue)
.cornerRadius(10)
.shadow(color: Color.cartvoltDarkBlue.opacity(0.9), radius: 5, x: 5, y: 5)
})
.padding(.bottom)
}
.onAppear{
}
.navigationTitle("\(selectedFolderTitle) • \(selectedFolderDate)")
.navigationBarTitleDisplayMode(.inline)
}
}
import Foundation
import Firebase
import FirebaseFirestore
import FirebaseFirestoreSwift
class ListRepository: ObservableObject {
let db = Firestore.firestore()
@Published var tasks = [ListItem]()
@Published var selectedFolderId = ""
init(){
loadData()
}
func loadData() {
let userId = Auth.auth().currentUser?.uid
db.collection("listItems")
.order(by: "createdTime")
.whereField("userId", isEqualTo: userId)
.addSnapshotListener { (querySnapshot, error) in
if let querySnapshot = querySnapshot {
self.tasks = querySnapshot.documents.compactMap { document in
do {
let x = try document.data(as: ListItem.self)
return x
}
catch {
print(error)
}
return nil
}
}
}
}
}
最好我想在ShoppingListItemsView
加載時將selectedFolderId
變量中包含的數據移動到ListRepository
onAppear{}
中的selectedFolderId
變量中,稍后我將在查詢中使用它。
如果有人能為我解決這個問題,那將意味着很多
嗨,Emere,歡迎來到 SO。 要獲得快速和高質量的答案,請閱讀這篇文章最小可重現示例
無論如何,您的案例似乎並不困難,您可以通過在ListRepository
中創建一個func
來實現您的目標,該函數將接受來自ShoppingListItemsView
的參數並重寫selectedFolderId
。 當您想設置新的selectedFolderId
時,隨時從您的視圖中調用該函數。
將此函數添加到ListRepository
:
func setSelectedFolderId(id: String) {
self.selectedFolderId = id
}
當您點擊項目並將新值傳遞到 function 時,將此修改添加到應更改selectedFolderIs
的視圖。
.onTapGesture { listRepository.setSelectedFolderId(id: String) }
將此 function 添加到ListRepository
func selectedFolderId(id: String) {
self.selectedFolderId = id
}
並在ShoppingListItemsView中替換
ForEach(taskListVM.taskCellViewModels){ taskCellVM in
TaskCell(taskCellVM: taskCellVM)
}
經過
ForEach(taskListVM.taskCellViewModels){ taskCellVM in
TaskCell(taskCellVM: taskCellVM)
.onTapGesture { listRepository.selectedFolderId(id: taskCellVM.id) }
}
我認為是 taskCellVM.id 給出了 id
每次點擊單元格,id都會改變
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.