I have three Views:
- MainView
- DetailView
- 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