Обновление представления SwiftUI после закрытия листа — методы и примеры кода

Чтобы обновить представление SwiftUI после закрытия листа, вы можете использовать различные методы в зависимости от ваших конкретных требований. Вот несколько подходов, которые вы можете использовать:

Метод 1: использование объекта среды

  1. Создайте класс ObservableObject, содержащий состояние, которое вы хотите обновить.
  2. Вставьте этот объект в иерархию представлений с помощью модификатора environmentObject(_:).
  3. Когда лист закрыт, измените состояние ObservableObject, чтобы вызвать обновление представлений, которые его наблюдают.

Вот пример:

import SwiftUI
class RefreshState: ObservableObject {
    @Published var shouldRefresh = false
}
struct ContentView: View {
    @EnvironmentObject var refreshState: RefreshState
    @State private var isPresentingSheet = false

    var body: some View {
        Button("Show Sheet") {
            isPresentingSheet = true
        }
        .sheet(isPresented: $isPresentingSheet) {
            SheetView(isPresented: $isPresentingSheet)
                .onDisappear {
                    refreshState.shouldRefresh.toggle()
                }
        }
        .padding()
        .refreshable {
            // Perform the refresh action here
        }
    }
}
struct SheetView: View {
    @Binding var isPresented: Bool
    var body: some View {
        Button("Close Sheet") {
            isPresented = false
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(RefreshState())
    }
}

Метод 2: использование переменной состояния

  1. Создайте в представлении переменную @State, которую хотите обновить.
  2. Когда лист закрыт, измените значение переменной @State, чтобы запустить обновление представления.

Вот пример:

struct ContentView: View {
    @State private var isPresentingSheet = false
    @State private var refreshFlag = false

    var body: some View {
        Button("Show Sheet") {
            isPresentingSheet = true
        }
        .sheet(isPresented: $isPresentingSheet) {
            SheetView(isPresented: $isPresentingSheet, refreshFlag: $refreshFlag)
        }
        .padding()
        .refreshable {
            // Perform the refresh action here
        }
    }
}
struct SheetView: View {
    @Binding var isPresented: Bool
    @Binding var refreshFlag: Bool
    var body: some View {
        Button("Close Sheet") {
            isPresented = false
            refreshFlag.toggle()
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

В обоих методах обновление запускается путем изменения переменной состояния при закрытии листа. Это изменение приводит к повторной визуализации представления и запуску действия обновления, если представление обновляется.