SwiftUI Stepper - не фиксирует изменения в объектах представления или среды - PullRequest
0 голосов
/ 07 августа 2020

Итак, у меня есть страница настроек в 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)

...