Итак, у меня есть страница настроек в swiftui, которая (теоретически) должна позволять пользователю добавлять и удалять строки с помощью степпера, причем каждая строка обозначает число ... степпер находится внизу, а весь вещь - это представление прокрутки ... по какой-либо причине, когда появляется представление, я не могу заставить его загружать значения из среды, и, когда значение изменяется, среда не обновляется ... Я попытался установить это с копированием свойств среды в локальные свойства @State при появлении, затем копирование их обратно при исчезновении, но это не имело значения ...
struct Settings_SetupNumbersView: View {
@EnvironmentObject var env: GlobalEnvironment_Main
@Binding var isPresented: Bool
@State var tempText = ""
var body: some View {
return ZStack {
VStack {
HStack {
Spacer()
Button("DONE") {
self.isPresented.toggle()
}
.padding(.horizontal, 20)
.padding(.vertical, 10)
}
Divider()
if env.numbers.count == 0 {
//
} else {
ScrollView {
ForEach(self.env.numbers.indices, id: \.self) { number in
ZStack {
Rectangle()
.frame(height: K.screenHeight / 15)
.foregroundColor(.white)
HStack {
Spacer()
.frame(width: K.screenWidth / 20)
Text("#\(self.env.numbers.count + 1)")
.font(Font.custom("Montserrat-Medium", size: 17.0))
.foregroundColor(Color(K.SettingsTextColor))
Spacer()
TextField("", text: $tempText, onCommit: {
self.tempText = self.env.numbers[self.env.numbersIndex]
print("number committed \(self.env.numbers[self.env.numbersIndex])")
})
.font(Font.custom("Montserrat-Regular", size: 17.0))
.foregroundColor(Color(K.SettingsTextColor))
.multilineTextAlignment(.trailing)
.padding(.horizontal, K.screenWidth / 20)
// Spacer()
// .frame(width: K.screenWidth / 20)
}
}
}
}
.frame(height: 20)
}
if env.numbers.count == 0 {
Text("Tap Plus Button to Add a Number")
.font(Font.custom("Montserrat-Medium", size: 17.0))
.foregroundColor(Color(K.SettingsTextColor))
.lineLimit(1)
.minimumScaleFactor(0.25)
}
Spacer()
HStack {
Spacer()
.frame(width: K.screenWidth / 20)
Text("Add/Remove Numbers")
.font(Font.custom("Montserrat-Medium", size: 17.0))
.foregroundColor(Color(K.SettingsTextColor))
.lineLimit(1)
.minimumScaleFactor(0.25)
Spacer()
Stepper(onIncrement: {
self.env.numbers.append("12345")
print("Number should be added")
print(env.numbers.indices)
print(self.env.numbers)
print("count = \(self.env.numbers.count)")
},
onDecrement: {
if self.env.numbers.count != 0 {
print("number should be removed")
self.env.numbers = self.env.numbers.dropLast()
print(env.numbers.indices)
print(self.env.numbers)
print("count = \(self.env.numbers.count)")
}
}) {
Text("")
}
.labelsHidden()
.padding(.vertical, K.screenHeight / 70)
Spacer()
.frame(width: K.screenWidth / 20)
}
}.onAppear(perform: {
print(env.numbers.indices)
})
}
}
}
Есть ли уловка с SwiftUI, где представление листа не может обновлять переменные или что-то в этом роде? Я в недоумении, макет листа работает, и значения попадают в env в соответствии с операторами печати, но когда я закрываю лист и возвращаю значения, сброшенные (и когда я нажимаю плюс, он удаляет массив, он писал и записывал новое значение) ... если все идет идеально, когда я нажимаю + добавляется новая строка, - удаляет последнюю, и если я закрываю лист и возвращаюсь, те же созданные строки все еще там (на основе значений массива env.numbers)