Firestore не сохраняет данные

Я пытаюсь сделать простое приложение, которое позволяет пользователям создавать рецепты, а затем загружать их в firestore.

Я использую объект среды для хранения данных, пока не загружу его в хранилище огня.

Моя проблема в том, что когда я проверяю firestore, чтобы увидеть, загружены ли мои данные, данные там пусты

Вот мой класс рецептов:

import Foundation

class recipe: ObservableObject{
    @Published var name: String = ""
    @Published var prepMins: Int = 0
    @Published var prepHours: Int = 0
    @Published var cookMins: Int = 0
    @Published var cookHours: Int = 0
    @Published var restMins: Int = 0
    @Published var restHours: Int = 0
    @Published var dishType: String = ""
    @Published var cuisine: String = ""
    @Published var difficulty: String = ""
    @Published var instructions: [String] = []
    @Published var ingredients: [String] = []
}

Вот пример просмотра загрузки:

import SwiftUI

struct UploadView: View {
    
    @State private var dishType = "Starter"
    @State private var cuisine = "European"
    @State private var difficulty = "Easy"
    @State var name: String = ""
    @State private var isPresented = false
    @State private var isPresented1 = false
    
    @State var prepHours: Int = 0
    @State var prepMins: Int = 0
    @State var cookHours: Int = 0
    @State var cookMins: Int = 0
    @State var restHours: Int = 0
    @State var restMins: Int = 0
    
    @StateObject var recipe1 = recipe()
    
    @EnvironmentObject var viewRouter: ViewRouter
    
    var options = ["Easy", "Medium", "Difficult"]
    
    var body: some View {
        ScrollView{
            VStack{
                HStack{
                    Spacer()
                    Text("Create a Recipe")
                        .font(.system(size: 30))
                        .fontWeight(.bold)
                    Spacer()
                }
                .padding(.top)
            }
            Group{
                HStack{
                    Text("Name")
                        .padding()
                        .font(.system(size: 25, weight: .medium))
                    Spacer()
                }
                HStack{
                    TextField("Enter a name", text: $name)
                        .padding()
                    
                        .zIndex(1)
                    Spacer()
                }
            }
            Group{
                HStack{
                    Text("Choose a dish type")
                        .padding()
                    Spacer()
                }
                
                HStack{
                    Button(dishType) {
                        isPresented.toggle()
                        
                    }
                    .fullScreenCover(isPresented: $isPresented) {
                        SelectionView()
                    }
                    Spacer()
                }
                .padding(.horizontal)
                
                
                
                HStack{
                    Text("Choose a cuisine")
                    
                    
                        .padding()
                    Spacer()
                }
                
                HStack{
                    Button(cuisine) {
                        isPresented1.toggle()
                    }
                    .fullScreenCover(isPresented: $isPresented1) {
                        SelectionView1()
                    }
                    Spacer()
                }
                .padding(.horizontal)
                
                
                
            }
            HStack{
                Text("Choose a difficulty")
                    .padding()
                Spacer()
            }
            Picker("Diffuculty", selection: $difficulty) {
                ForEach(options, id: \.self) {
                    Text($0)
                }
            }
            .pickerStyle(.segmented)
            .padding(.horizontal)
            .padding(.bottom)
            Group{
                
                VStack{
                    HStack{
                        Text("Prep Time")
                            .fontWeight(.medium)
                            .padding(.horizontal)
                            .padding(.bottom)
                        Spacer()
                    }
                    
                    HStack{
                        Text("How long does it take to make the dish")
                            .fontWeight(.light)
                            .padding(.horizontal)
                        Spacer()
                    }
                    
                }
                HStack{
                    HStack{
                        VStack {
                            Picker("", selection: $prepHours){
                                ForEach(0..<12, id: \.self) { i in
                                    Text("\(i) hours").tag(i)
                                }
                            }
                        }
                        VStack {
                            Picker("", selection: $prepMins){
                                ForEach(0..<60, id: \.self) { i in
                                    Text("\(i) min").tag(i)
                                }
                            }
                        }
                        
                    }
                    .padding(.horizontal)
                    .padding(.bottom)
                    Spacer()
                }
                VStack{
                    
                    VStack{
                        HStack{
                            Text("Cook Time")
                                .fontWeight(.medium)
                                .padding(.horizontal)
                                .padding(.bottom)
                            Spacer()
                        }
                        HStack{
                            Text("How long does it take to cook the dish")
                                .fontWeight(.light)
                                .padding(.horizontal)
                            Spacer()
                            
                        }
                        
                    }
                    
                }
                HStack{
                    HStack{
                        VStack {
                            Picker("", selection: $cookHours){
                                ForEach(0..<12, id: \.self) { i in
                                    Text("\(i) hours").tag(i)
                                }
                            }
                        }
                        VStack {
                            Picker("", selection: $cookMins){
                                ForEach(0..<60, id: \.self) { i in
                                    Text("\(i) min").tag(i)
                                        .foregroundColor(.black)
                                }
                            }
                        }
                        
                    }
                    .padding(.horizontal)
                    .padding(.bottom)
                    Spacer()
                }
                VStack{
                    
                    VStack{
                        HStack{
                            Text("Rest Time")
                                .fontWeight(.medium)
                                .padding(.horizontal)
                                .padding(.bottom)
                            Spacer()
                        }
                        
                        HStack{
                            Text("How long does the dish need to rest")
                                .fontWeight(.light)
                                .padding(.horizontal)
                            Spacer()
                        }
                        
                    }
                    
                }
                HStack{
                    HStack{
                        VStack {
                            Picker("", selection: $restHours){
                                ForEach(0..<12, id: \.self) { i in
                                    Text("\(i) hours").tag(i)
                                }
                            }
                        }
                        VStack {
                            Picker("", selection: $restMins){
                                ForEach(0..<60, id: \.self) { i in
                                    Text("\(i) min").tag(i)
                                        .foregroundColor(.black)
                                }
                            }
                        }
                        
                    }
                    .padding(.horizontal)
                    .padding(.bottom)
                    Spacer()
                }
            }
            
            Button {
                //change view router
                //add data to data class
                recipe1.name = name
                recipe1.dishType = dishType
                recipe1.cuisine = cuisine
                recipe1.difficulty = difficulty
                recipe1.prepMins = prepMins
                recipe1.prepHours = prepHours
                recipe1.cookMins = cookMins
                recipe1.cookHours = cookHours
                recipe1.restMins = restMins
                recipe1.restHours = restHours
                viewRouter.currentPage = .uploadView2
            } label: {
                Label("next", systemImage: "arrow.right")
            }
            
            .padding()
            .frame(width: 100)
            .foregroundColor(Color.white)
            .background(Color.red)
            .cornerRadius(8)
        }
        .environmentObject(recipe1)
    }
}



struct UploadView_Previews: PreviewProvider {
    static var previews: some View {
        UploadView()
            .previewDevice(PreviewDevice(rawValue: "iPhone 13"))
        UploadView()
            .previewDevice(PreviewDevice(rawValue: "iPhone 8"))
    }
}

И вот мой окончательный вид с функцией загрузки

import SwiftUI
import Firebase

struct UploadView3: View {
    
    @EnvironmentObject var viewRouter: ViewRouter
    
    @StateObject var recipe1 = recipe()
    
    var body: some View{
        ScrollView{
            VStack{
                HStack{
                    Button {
                        print("Going Back")
                        viewRouter.currentPage = .uploadView2
                    } label: {
                        Image(systemName: "arrow.left")
                            .font(.system(size: 30))
                            .foregroundColor(.black)
                    }
                    .padding(.horizontal)
                    Spacer()
                    Text("Add Instructions")
                        .font(.system(size: 30))
                        .fontWeight(.bold)
                    Spacer()
                    Button {
                        print("Saved")
                    } label: {
                        Image(systemName: "bookmark")
                            .font(.system(size: 30))
                            .foregroundColor(.black)
                    }
                    .padding()
                }
                Text("Add Instructions so that people can easily follow your recipe")
                    .padding()
                Button {
                    self.addData()
                } label: {
                    Label("next", systemImage: "arrow.right")
                }

            }
        }
        .environmentObject(recipe1)
    }
    
    func addData(){
        let db = Firestore.firestore()
        guard let uid = FirebaseManager.shared.auth.currentUser?.uid else{return}
        db.collection("Recipes").addDocument(data: ["id" : uid, "name" : recipe1.name, "dishType" : recipe1.dishType, "cuisine" : recipe1.cuisine, "difficulty" : recipe1.difficulty,"prepMins" : recipe1.prepMins, "prepHours": recipe1.prepHours, "cookMins" : recipe1.cookMins, "cookHours": recipe1.cookHours, "restMins" : recipe1.restMins, "restHours" : recipe1.restHours, "ingredients" : recipe1.ingredients])
        { err in
            if let err = err {
                print("Error writing document: \(err)")
            } else {
                print("Document successfully written!")
            }
        }

        
    }
}

struct UploadView3_Previews: PreviewProvider {
    static var previews: some View {
        UploadView3()
    }
}

если есть лучший способ, чем использование объекта среды, сообщите мне, иначе как я могу передавать данные между своими представлениями?

Большое спасибо за ваше время

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

у вас есть два независимых @StateObject var recipe1 = recipe(), один в UploadView и в UploadView3. Поэтому, когда вы используете func addData(){...} в UploadView3, у вас появляется новый пустой recipe.

У вас должен быть только один, единственный источник истины. Затем используйте @ObservedObject var recipe1: recipe или .environmentObject(recipe1) и @EnvironmentObject var recipe1: recipe, чтобы передать его.

поэтому, если бы я сделал еще одно представление, добавленное в мой класс рецепта, мне нужен был бы еще один объект состояния

Sean 24.04.2022 09:00

Нет, определенно нет. Имейте только один @StateObject var recipe1 = recipe() в самом высоком представлении и передайте recipe1 всем остальным представлениям с помощью .environmentObject(recipe1) и используя @EnvironmentObject var recipe1: recipe в других представлениях. Таким образом, все представления будут использовать единую модель, к которой они могут получить доступ.

workingdog support Ukraine 24.04.2022 09:25

Другие вопросы по теме