В этом примере первый LibraryView имеет проблему при отображении предупреждения, второй LibraryView сохраняет ожидаемое состояние.
Код: Выделить всё
struct ContentView: View {
var body: some View {
NavigationStack {
List {
VStack {
LibraryView(title: "Show view (Loss of state)")
}
LibraryView(title: "Show view (Works as expected)")
}
}
}
}
/// This view is from a package dependency and wants to control the presentation of the sheet internally
public struct LibraryView: View {
@State private var isPresented: Bool = false
let title: String
public init(title: String) {
self.title = title
}
public var body: some View {
Button(self.title) {
self.isPresented = true
}
.sheet(isPresented: self.$isPresented) {
ViewWithAlert()
}
}
}
private struct ViewWithAlert: View {
@State private var isPresented: Bool = false
@State private var presentedCount = 0
var body: some View {
Button("Show Alert, count: \(presentedCount)") {
isPresented = true
presentedCount += 1
}
.alert("Hello", isPresented: self.$isPresented) {
Button("OK") { }
}
}
}
Проблему можно решить, переместив .sheet на более высокий уровень макета (т. е. в NavigationStack). Однако библиотека хочет контролировать это представление и не требовать интеграции для представления листа.
Подробнее здесь: https://stackoverflow.com/questions/798 ... t-is-shown
Мобильная версия