У меня есть этот ContentView с двумя разными модальными представлениями, поэтому я использую sheet(isPresented:)оба, но, похоже, представлен только последний. Как я могу решить эту проблему? Или невозможно использовать несколько листов в представлении в SwiftUI?
struct ContentView: View {
@State private var firstIsPresented = false
@State private var secondIsPresented = false
var body: some View {
NavigationView {
VStack(spacing: 20) {
Button("First modal view") {
self.firstIsPresented.toggle()
}
Button ("Second modal view") {
self.secondIsPresented.toggle()
}
}
.navigationBarTitle(Text("Multiple modal view problem"), displayMode:.inline)
.sheet(isPresented: $firstIsPresented) {
Text("First modal view")
}
.sheet(isPresented: $secondIsPresented) {
Text("Only the second modal view works!")
}
}
}
}
Приведенный выше код компилируется без предупреждений (Xcode 11.2.1).
Решение проблемы
УПДНачиная с Xcode 12.5.0 Beta 3 (3 марта 2021 г.) этот вопрос больше не имеет смысла, поскольку теперь можно иметь несколько .sheet(isPresented:)или .fullScreenCover(isPresented:)подряд, и код, представленный в вопросе, будет работать нормально.
Тем не менее, я считаю этот ответ по-прежнему действительным, поскольку он очень хорошо организует листы и делает код чистым и более читабельным - у вас есть один источник истины вместо пары независимых логических значений.
Фактический ответЛучший способ сделать это, который также работает для iOS 14:
enum ActiveSheet: Identifiable {
case first, second
var id: Int {
hashValue
}
}
struct YourView: View {
@State var activeSheet: ActiveSheet?
var body: some View {
VStack {
Button {
activeSheet =.first
} label: {
Text("Activate first sheet")
}
Button {
activeSheet =.second
} label: {
Text("Activate second sheet")
}
}
.sheet(item: $activeSheet) { item in
switch item {
case.first:
FirstView()
case.second:
SecondView()
}
}
}
}
Подробнее читайте здесь: https://developer.apple.com/documentation/swiftui/view/sheet(item:ondismiss:content:)
Чтобы скрыть только что установленный листactiveSheet = nil
Бонус:
если вы хотите, чтобы ваш лист был полноэкранным, используйте тот же код, но вместо .sheetзаписи.fullScreenCover
Комментариев нет:
Отправить комментарий