繁体   English   中英

如何将数据从视图中的变量传递到视图 model class

[英]How do I pass data from a variable in a view to a view model class

我的数据包含在一个名为selectedFolderId的变量中,这样做的目的是我想将此变量中的数据传递到 class 中,这样我可以在ShoppingListItemsView加载的任何时候从 Firestore 中读取我的数据库内容。

如果他们能解释并告诉我如何将这些数据从我的ShoppingListItemsView传递到我的ListRepository class 中,我将不胜感激,我将进一步使用这些数据进行查询。

下面是ShoppingListItemsViewListRepository类:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM