#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 !!
})