簡體   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