Не удается добавить что-либо в массив

#ios #swift #xcode #swiftui

#iOS #быстрый #xcode ( код x ) #свифтуи

Вопрос:

я создал приложение на SwiftUI, в котором вы можете создавать разные классы. Приложение сохраняет это в массиве. У меня есть текстовое поле и кнопка в том же виде, что и scrollview, который отображает массив. Это работает отлично, и я могу легко добавлять новые классы. Теперь я создал новое представление с текстовым полем и кнопкой. Это представление можно просмотреть, нажав кнопку на панели навигации. Он использует ту же функцию, что и в другом представлении, но в другом представлении добавление элемента в массив работает, в этом представлении это не работает. Я надеюсь, вы понимаете мою проблему и можете мне помочь. Спасибо.

Это файл, в котором я храню массив:

 import Foundation
import SwiftUI
import Combine

struct Class: Identifiable {
    var name: String
    var id = UUID()
}

class ClassStore: ObservableObject {
    @Published var classes = [Class]()
}
  

Это представление с кнопкой текстовое поле, которое работает, и scrollview, который отображает массив:

 import SwiftUI

struct ContentView: View {
    @State var showNewClass = false
    @ObservedObject var classStore = ClassStore()
    @State var newClass: String = ""
    @State var toDoColor: Color = Color.pink
    
    func addNewClass() {
        classStore.classes.append(
            Class(name: newClass)
        )
        newClass = ""
    }
    
    
    var body: some View {
        NavigationView {
            VStack {
                HStack {
                    TextField("New Todo", text: $newClass)
                    Image(systemName: "app.fill")
                        .foregroundColor(Color.pink)
                        .padding(.horizontal, 3)
                    Image(systemName: "books.vertical")
                        .padding(.horizontal, 3)
                    if newClass == "" {
                        Text("Add!")
                            .foregroundColor(Color.gray)
                    } else {
                        Button(action: {
                            addNewClass()
                        }) {
                            Text("Add!")
                        }
                    }
                }.padding()
                ScrollView {
                    ForEach(self.classStore.classes) { name in
                        Text(name.name)
                    }
                }
                .navigationBarTitle(Text("Schulnoten"))
                .navigationBarItems(trailing:
                Button(action: {
                    self.showNewClass.toggle()
                }) {
                    Text("New Class")
                }
                .sheet(isPresented: $showNewClass) {
                    NewClass(isPresented: $showNewClass)
                })
            }
        }
    }
}
  

И это новое представление, которое я создал, кнопка и текстовое поле имеют точно такой же код, но почему-то это не работает:

 import SwiftUI

struct NewClass: View {
    @Binding var isPresented: Bool
    @State var className: String = ""
    @ObservedObject var classStore = ClassStore()
    
    func addNewClass() {
        classStore.classes.append(
            Class(name: className)
        )
    }
    
    var body: some View {
        VStack {
            HStack {
                Text("New Class")
                    .font(.title)
                    .fontWeight(.semibold)
                Spacer()
            }
            TextField("Name of the class", text: $className)
                .padding()
                .background(Color.gray)
                .cornerRadius(5)
                .padding(.vertical)
            Button(action: {
                addNewClass()
                self.isPresented.toggle()
            }) {
                HStack {
                    Text("Safe")
                        .foregroundColor(Color.white)
                        .fontWeight(.bold)
                        .font(.system(size: 20))
                }
                .padding()
                .frame(width: 380, height: 60)
                .background(Color.blue)
                .cornerRadius(5)
            }
            Spacer()
        }.padding()
    }
}
  

Извините, если мой английский не настолько хорош. Я не являюсь носителем языка.

Ответ №1:

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

 struct NewClass: View {
    @Binding var isPresented: Bool
    @State var className: String = ""
    @ObservedObject var classStore: ClassStore   // << expect external
  

и в ContentView

 .sheet(isPresented: $showNewClass) {
    NewClass(isPresented: $showNewClass, classStore: self.classStore) // << here !!
})