How can I change item in list of @EnvironmentObject SwiftUI?

59 Views Asked by At

I have three Views:

  1. MainView
  2. DetailView
  3. EditView

MainView has the list which shows mock data get from @EnvironmentObject. When I select row it passes to the DetailView and there there is Edit Button after I tap it EditView opens. When I edit item it doesn't updates in the mainView.

struct Fishing: Identifiable {
    
    let id: UUID = UUID()
    var type: FishingType
    var name: String
    var water: Water
    var photo: [String?]
    var fishingTime: Date
    var weight: Double = 0
    var fish: [Fish]
    var fishingMethod: FishingMethod
    var bait: Bait
    var comment: String = ""
    let user: User
}
class FishingData: ObservableObject {
    @Published var mockFishings: [Fishing] = [
        Fishing(
            type: .haul,
            name: "На Карася",
            water: Water(waterName: "Минское Море", latitude: 53.95644, longitude: 27.36064),
            photo: [nil],
            fishingTime: .now,
            weight: 3.2,
            fish: [Fish(name: "Карась", count: 5), Fish(name: "Окунь", count: 1)],
            fishingMethod: .flyFishing, bait: .maggot,
            comment: "Для рыбалки замешал три пачки корма: Ультра Лещ, Река Биг Фиш и Карп Кукуруза, в последствии пожалел, что не остановился на двух пачках. Когда рыба стала плотно на точку и ловилась на каждом забросе, я просто ждал когда закончится корм. Фидербай как всегда рулит.",
            user: User(image: "", name: "Никита Белозерцев", email: "[email protected]")).... ect.
struct MainView: View {
    
    @EnvironmentObject var fishingData: FishingData
    @State private var showDetailView = false
    
    var body: some View {
        NavigationStack {
            List {
                ForEach($fishingData.mockFishings) { $fishing in
                    ZStack {
                        FishingItem(fishingData: fishing)
                        NavigationLink(destination: DetailFishingView(fishing: $fishing)) {
                            EmptyView()
                        }
                        .opacity(0)
                    }
                    .listRowBackground(RoundedRectangle(cornerRadius: 10)
                        .fill(Color.white)
                        .padding(2))
                }
                .onDelete(perform: { indexSet in
                    fishingData.delete(indexSet)
                })
            }
            .listStyle(.plain)
            .scrollIndicators(.hidden)
            .navigationTitle("Fishing Journal")
            .navigationBarTitleDisplayMode(.large)
struct DetailFishingView: View {
    
    @Binding var fishing: Fishing

    @State private var selectedImage: String?
    @State private var showEditView = false
    @State private var showPhotoView = false
    @State private var isFavorite = false
    
    
    var body: some View {
        NavigationStack {
            ScrollView {
                VStack(alignment: .leading, spacing: 10) {
                    FishingPhotos(fishing: fishing, selectedImage: $selectedImage, isPresentingPhotoView: $showPhotoView)
                    Header(fishing: fishing)
                    FishCaught(fishing: fishing)
                    FishingInfo(fishing: fishing)
                    WaterInfo(fishing: fishing)
                    Comment(fishing: fishing)
                }
                .padding(10)
            }
            .navigationTitle(fishing.name)
            .navigationBarTitleDisplayMode(.inline)
            .scrollIndicators(.hidden)
        }
        .fullScreenCover(isPresented: $showPhotoView, content: {
            NavigationStack {
                PhotoView(fishing: fishing, selectedImage: $selectedImage)
            }
        })
        .toolbar {
            ToolbarItem(placement: .navigationBarTrailing) {
                Button {
                    showEditView = true
                } label: {
                    Text("Изменить")
                }
            }
        }
        .sheet(isPresented: $showEditView) {
            NavigationStack {
                EditFishingView(fishing: $fishing, showEditView: $showEditView)
            }
        }
    }
}
struct EditFishingView: View {
    
    @EnvironmentObject var fishingData: FishingData
    
    @Binding var fishing: Fishing
    @Binding var showEditView: Bool
    
    
    //Edit Fishing States
    @State private var fishingName: String = ""
    @State private var fishingType: FishingType = .fishingLog
    
    
    var body: some View {
            ScrollView(.vertical, showsIndicators: false) {
                VStack(alignment: .leading, spacing: 10) {
                    EF_HeaderView(fishing: $fishing, fishingName: $fishingName, fishingType: $fishingType)

                }
                .shadow(color: .gray, radius: 4, x: 0, y: 2)
                .padding(10)
            }
            .background(Color(red: 242/255, green: 242/255, blue: 247/255))
            .navigationBarTitleDisplayMode(.inline)
            .navigationTitle(fishing.name)
            .toolbar {
                ToolbarItem(placement: .topBarLeading) {
                    Button(action: {
                        
                    }, label: {
                        Image(systemName: "bookmark")
                    })
                }
                ToolbarItem(placement: .cancellationAction) {
                    Button("Отмена") {
                        showEditView = false
                    }
                }
                ToolbarItem(placement: .confirmationAction) {
                    Button("Готово") {
                        fishing.name = fishingName
                        fishing.type = fishingType
                        if let index = fishingData.mockFishings.firstIndex(where: { $0.id == fishing.id }) {
                            fishingData.mockFishings[index] = fishing
                            print("fishingData ID\(index)")
                            print(fishing.name)
                            print(fishingData.mockFishings[index].name)

                        }
                        print("Fishing ID\(fishing.id)")

                        showEditView = false
                    }
                }
            }
//        .sheet(isPresented: $showFishList) {
//            NavigationStack {
//                EF_FishPicker(fishing: $fishing)
//            }
//        }
        

    }
}

I can't figure out what I'm doing wrong

0

There are 0 best solutions below