[英]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.