В чем ошибка в коде и как исправить?

Я только назачал изучения Swift и столкнулся со следующими проблемами из-за не хватки знаний

  1. При открытии View CategoryEditor кнопкой Add Trening из TreningEditor для добавления новых данных в trening.catTrening, добаляется преведущий элемент, а не тот который сохраняет и заполняет пользователь в CategoryEditor
  2. При открытии View CategoryEditor второй и последующий разы, открывается View CategoryEditor с уже заполненными ранее данными , а не пустой для добавления новых данных

Как исправить и сделать привильный Binding, чтобы в коллекцию TreningEditor trening.catTrening добавлялись элементы созданные пользователем в CategoryEditor?

import SwiftUI

struct TreningEditor: View {
    @Binding var trening: TreningItem
    @State var isNew = false
    @State var isNewCat = false
    
    @Environment(\.dismiss) private var dismiss
    @FocusState var focusedExercise: Item?
    @FocusState var focusedExerciseList: Exercise?
    @State private var isPickingSymbol = false
    
    @State private var isAddingNewCategory = false
    @State private var newCategory = Item()
    
    var body: some View {
     
            List {
                HStack {
                    Button {
                        isPickingSymbol.toggle()
                    } label: {
                        Image(systemName: trening.symbol)
                            .imageScale(.large)
                            .foregroundColor(Color(trening.color))
                    }
                    .buttonStyle(.plain)
                    .padding(.horizontal, 5)
                    
                    TextField("New Trening", text: $trening.treningName)
                        .font(.title2)
                    
                    Button {
                        isPickingSymbol.toggle()
                    }
                label: {
                    HStack {
                        Image(systemName: "plus")
                    } .buttonStyle(.plain)
                }
                    
                }
                .padding(.top, 5)
                
                DatePicker("Date", selection: $trening.date)
                    .labelsHidden()
                    .listRowSeparator(.hidden)
                
                Text("Exercises")
                    .fontWeight(.bold)
                
                
                ForEach(self.trening.catTrening.indices, id: \.self)// $trening.catTrening)
                { 
                    i in Text("Exercises count: \($trening.catTrening[i].exercise.count)")
                    
                }
                .onDelete(perform: { indexSet in
                    trening.catTrening.remove(atOffsets: indexSet)
                })
                
                Button {
                  
                        print("GeT Append category...")
                        trening.catTrening.append(newCategory)
                        newCategory = trening.catTrening.last ?? Item() 
                        isNewCat = true
                        //focusedExercise = newCat
                        
                        print("Append category...")
                    
                } label: {
                    HStack {
                        Image(systemName: "plus")
                        Text("Add Trening")
                    }
                }
                .buttonStyle(.borderless)
                .sheet(isPresented: $isNewCat) {
                    CategoryEditor(trening: $newCategory, isNewCat: isNewCat)
                }
            }
        
#if os(iOS)
            .navigationBarTitleDisplayMode(.inline)
#endif
        .sheet(isPresented: $isPickingSymbol) {
            SymbolPicker(trening: $trening)
        }
    }
}

struct TreningEditor_Previews: PreviewProvider {
    static var previews: some View {
        TreningEditor(trening: .constant(TreningItem()), isNew: true)
            .environmentObject(ItemData())
    }
}

==

import SwiftUI

struct CategoryEditor: View {
    @Binding var trening: Item
    @State var isNewCat = false
    
    @Environment(\.dismiss) private var dismiss
    @FocusState var focusedExercise: Exercise?
    @State private var isPickingSymbol = false
    
    @State private var isAddingNewCategory = false
    @State private var newCategory = Item()
    
    @State var category: String = "Ноги"
     var categoryList = ["Руки","Ноги", "Грудь", "Плечи", "Шея", "Кардио", "Плавание","Фитнес"]
    
     @State var tag: String = "Не выбрано"
     var tagList = ["Не выбрано","Икры","Пресс", "Брасс"]
    
    var body: some View {
        NavigationView
        {
            List {
                // isPickingSymbol.toggle()
                HStack(alignment: .center) {
                    Text("New Category").font(.title2).foregroundColor(Color(trening.color)).frame(minWidth: 0, idealWidth: 100, maxWidth: .infinity, minHeight: 0, idealHeight: 35, maxHeight: .infinity, alignment: .center) 
                }
                .padding(.top, 5)
                
                Picker(selection: $category, label: Text("Тренируем"))
                {
                    ForEach(categoryList, id: \.self)
                    {
                        Text($0)
                    }
                    
                }  .listRowSeparator(.hidden)
                
                Picker(selection: $tag, label: Text("Тег"))
                {
                    ForEach(tagList, id: \.self)
                    {
                        Text($0)
                    }
                    
                }  .listRowSeparator(.hidden)
                
                Text("Exercises")
                    .fontWeight(.bold)
                
                ForEach($trening.exercise)
                { 
                 $item in  ExerciseAddRow(exercise: $item, focusedExercise: $focusedExercise, exerciseSelect: "Не выбрано", exerciseSelectList: ["Не выбрано","Жим ногами"])
                }
                .onDelete(perform: { indexSet in
                    trening.exercise.remove(atOffsets: indexSet)
                })
                
                Button {
                    let newExercise = Exercise(exerciseName: "", 
                                               set: 4, rep: 12, 
                                               link: "",
                                               exerciseCat: "",
                                               isNew: true  )
                    
                    trening.exercise.append(newExercise)
                    focusedExercise = newExercise
                } label: {
                    HStack {
                        Image(systemName: "plus")
                        Text("Add Exercise")
                    }
                }
                .buttonStyle(.borderless)
            }
            
#if os(iOS)
            .navigationBarTitleDisplayMode(.inline)
#endif
            .sheet(isPresented: $isPickingSymbol) {
                // SymbolPicker(trening: $trening)
            }.toolbar{
                ToolbarItem(placement: .cancellationAction){
                    Button("Cancel", action: {dismiss()}).foregroundColor(Color(trening.color))
                }
                ToolbarItem(placement: .confirmationAction){
                    Button("Save", action: 
                            {
                        SaveItemExercises()
                        CategoryEditor(trening: $trening, isNewCat: false)
                        dismiss()
                        
                    }).foregroundColor(Color(trening.color))
                }
            }
        }
    }
    
    func AddExercise() -> Item{
        var addExercise = [Exercise(exerciseName: "Тестовый жим ногами 12", set: 4, rep: 15, link: "", exerciseCat: "", isNew: true)] 
        return Item(category: "Ноги", tag: "Икры", exerciseName: "", rep: 0, set: 0, time: 0, currentDate: Date.now, exercise: addExercise, date: Date.now, symbol: "case.fill", color: ColorOptions.random().rgbaColor);
    }
    
    func SaveItemExercises()
    {
        trening.category = category
        trening.tag = tag
        trening.currentDate = Date.now
        trening.symbol = ItemSymbols.randomName()
        print("Save category: \(trening.category)")
        print("Save tag: \(trening.tag)")
        print("Save count exercise: \(trening.exercise.count)")
        
    }
    
    func GetTrening() -> Item
    {
        return trening
    }
}

struct CategoryEditor_Previews: PreviewProvider {
    static var previews: some View {
        CategoryEditor(trening: .constant(Item()), isNewCat: true)
            .environmentObject(ItemData())
    }
}

Ответы (0 шт):