Новичок в SwiftUI, так что простите мое невежество.
У меня есть несколько кнопок в HStack. Я хочу, чтобы каждая кнопка показывала другой вид. Мой код кнопки выглядит так:
HStack {
Button(action: { showSheet.toggle() } ) {
Image("one")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheet) {
OneView(showSheet: $showSheet)
}
Button(action: { showSheet.toggle() } ) {
Image("two")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheet) {
TwoView(showSheet: $showSheet)
}
Button(action: { showSheet.toggle() } ) {
Image("three")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheet) {
ThreeView(showSheet: $showSheet)
}
Button(action: { showSheet.toggle() } ) {
Image("four")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheet) {
FourView(showSheet: $showSheet)
}
}
У меня также есть это на верхнем уровне:
@State private var showSheet = false
Вот проблема: неважно, какую кнопку я нажимаю, она показывает OneView. Я также попытался добавить .sheet... внутри каждого представления кнопки следующим образом:
Button(action: { showSheet.toggle() } ) {
Image("one")
.resizable()
.scaledToFit()
.sheet(isPresented: $showSheet) {
OneView(showSheet: $showSheet)
}
}
Но происходит такое же поведение. Что я делаю не так?
если вы посмотрите на
@State private var showSheet = false
И
.sheet(isPresented: $showSheet) { OneView(showSheet: $showSheet) }
А также это внутри любого из ваших действий с кнопками
showSheet.toggle()
Это означает, что когда переменная showSheet переключается, она активирует модификатор .sheet и представляет экземпляр OneView, что становится проблемой, поскольку переменная showSheet может запускать только один лист за раз, который является первым в вашем коде SwiftUI. , так что вам нужно иметь разные переменные для обработки разных презентаций листов, например:
@State private var showSheetOne = false
@State private var showSheetTwo = false
@State private var showSheetThree = false
@State private var showSheetFour = false
И для каждого модификатора .sheet вы хотите индивидуально установить привязки и переключать каждую в соответствующей кнопке.
HStack {
Button(action: { showSheetOne.toggle() } ) {
Image("one")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheetOne) {
OneView(showSheet: $showSheetOne)
}
Button(action: { showSheetTwo.toggle() } ) {
Image("two")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheetTwo) {
TwoView(showSheet: $showSheetTwo)
}
Button(action: { showSheetThree.toggle() } ) {
Image("three")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheetThree) {
ThreeView(showSheet: $showSheetThree)
}
Button(action: { showSheetFour.toggle() } ) {
Image("four")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheetFour) {
FourView(showSheet: $showSheetFour)
}
}
Это решение также сработало, но я выбрал вариант выше только потому, что результат был немного короче. Спасибо!
Попробуйте использовать разные имена переменных для каждого представления. Или множество:
@State private var showSheet = Array(repeating: false, count: 5)
// [0, 0, 0, 0, 0]
// ^ we want the array start from 1
// so we add 0 at the first.
Использовать:
HStack {
Button(action: { showSheet[1].toggle() } ) {
Image("one")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheet[1]) {
OneView(showSheet: $showSheet[1)
}
Button(action: { showSheet[2].toggle() } ) {
Image("two")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheet[2]) {
TwoView(showSheet: $showSheet[2])
}
Button(action: { showSheet[3].toggle() } ) {
Image("three")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheet[3]) {
ThreeView(showSheet: $showSheet[3])
}
Button(action: { showSheet[4].toggle() } ) {
Image("four")
.resizable()
.scaledToFit()
}.sheet(isPresented: $showSheet[4]) {
FourView(showSheet: $showSheet[4])
}
}
Работал отлично и помог мне понять, как работают представления. Спасибо!
Используйте модификатор один
sheet
и используйтеsheet(item:)
from вместоsheet(isPresented:)