如何将数据从视图中的变量传递到视图模型类

yyyllmsg  于 2022-09-19  发布在  Swift
关注(0)|答案(1)|浏览(171)

我的数据包含在一个名为selectedFolderId的变量中,其目的是希望将此变量中的数据传递到一个类中,以便在加载ShoppingListItemsView时随时从FireStore读取数据库的内容。

如果任何人能解释并向我展示如何将这些数据从我的ShoppingListItemsView传递到我的ListRepository类中,我将在其中进一步使用这些数据进行查询,我将非常感激。

下面是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
                }
            }
        }
    }
}

您可以看到onAppear{}加载时,我希望将ShoppingListItemsViewselectedFolderId变量中包含的数据移动到ListRepository类中的selectedFolderId变量中,稍后我将在查询中使用它。

如果有人能帮我解决这个问题,那就太好了

qnzebej0

qnzebej01#

嗨,Emere,欢迎来到So。要获得快速和高质量的答案,请阅读本文Minimal reproducible example

无论如何,您的案例看起来并不困难,您可以通过在ListRepository中创建一个func来实现您的目标,该func将接受ShoppingListItemsView中的参数并重写selectedFolderId。当您想要设置新的selectedFolderId时,可以随时从您的视图调用该函数。

将此函数添加到ListRepository

func setSelectedFolderId(id: String) {
    self.selectedFolderId = id
}

将此修改添加到View中,当您点击项目并将新值传递到函数时,该修改将更改selectedFolderIs

.onTapGesture { listRepository.setSelectedFolderId(id: String) }

相关问题