SwiftUI: жест касания переключает представления
У меня есть следующий упрощенный код в проекте, использующем XCode 13.2. Предполагаемая функциональность - иметь 2 вкладки (и), и пользователь может касаться экрана, чтобы переключать фон с красного на зеленый.
Однако вместо этого при нажатии на экране отображается вкладка 1 вместо измененного цвета. Мне интересно, почему приложение переходит в то время, когда нажимается.
Нет никаких NavigationLinks или действий, которые заставляют пользователя переходить. Моя единственная мысль, что, возможно, приложение перестраивается при нажатии, поэтому оно возвращается на первую вкладку? Если да, то есть ли какие-нибудь обходные пути для этого?
Примечание: цвет по-прежнему меняется
Tab2
, но не раньше, чем приложение переключится на
Tab1
.
struct ContentView: View {
var body: some View {
TabView {
Tab1()
.tabItem {
Text("Tab 1")
}
Tab2()
.tabItem {
Text("Tab 2")
}
}
}
}
struct Tab1: View {
var body: some View {
Text("Tab 1")
}
}
struct Tab2: View {
@State var isRed: Bool = false
var body: some View {
if !isRed {
Color.green
.onTapGesture {
isRed = true
}
} else {
Color.red
.onTapGesture {
isRed = false
}
}
}
}
2 ответа
Я заметил, что использование if/else таким образом вызывает странное поведение. Рефакторинг Tab2, как показано ниже, и он должен работать как положено.
struct Tab2: View {
@State var isRed: Bool = false
var body: some View {
ZStack {
Color.red
Color.green
.opacity(isRed ? 0 : 1)
}
.onTapGesture {
isRed.toggle()
}
}
}
Причина, по которой нажатие на Tab2 приводит к возврату к Tab1, заключается в том, что структурная идентичность Tab2 меняется всякий раз, когда вы нажимаете на нее, что приводит к перезагрузке тела SwiftUI. Смотрите объяснение здесь . Простым исправлением приведенного выше примера было бы обернуть все тело в
ZStack
var body: some View {
ZStack {
if !isRed {
Color.green
.onTapGesture {
isRed = true
}
} else {
Color.red
.onTapGesture {
isRed = false
}
}
}
}