0

我在使用 XCode 13.2 的项目中有以下简化代码。预期的功能是有 2 个选项卡(Tab1Tab2),用户可以点击屏幕Tab2以将背景从红色切换为绿色。

但是,当Tab2单击 时,屏幕会显示选项卡 1,而不是Tab2更改后的颜色。我想知道为什么应用程序会Tab1Tab2被点击时进入。

没有使用户转到的 NavigationLinks 或操作Tab1。我唯一的想法是单击时应用程序可能正在重建Tab2,这就是为什么它会返回到第一个选项卡?如果是这样,有什么好的解决方法吗?

注意:颜色仍然会改变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
                }
        }
    }
}
4

2 回答 2

1

我注意到以这种方式使用 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()
    }
}

}

于 2021-12-27T22:21:40.220 回答
1

点击 Tab2 会导致它跳回 Tab1 的原因是,当您点击 Tab2 时,它的结构标识会发生变化,导致 swiftUI 重新加载 body。请参阅此处的说明。对上面示例的一个简单修复是将整个主体包裹在一个ZStack

var body: some View {
  ZStack {
    if !isRed {
      Color.green
        .onTapGesture {
          isRed = true
        }
    } else {
      Color.red
        .onTapGesture {
          isRed = false
        }
    }
  }
}
于 2021-12-28T03:53:45.887 回答