SwiftUI 视图切换语句导致 TabView 重置。

3
我在SwiftUI视图中使用了一个switch语句:
struct OnOffSwitchView: View {
    
    @ObservedObject var vm = ViewModel()
    
    var body: some View {
        switch vm.state {
        case .on:
            OnView(vm: vm)
        case .off:
            OffView(vm: vm)
        }
    }
}

@MainActor class ViewModel: ObservableObject {
    @Published var state: State = .on

    enum State {
        case on
        case off
    }
}

当孩子视图改变 ViewModel 状态(开和关是相同的),使得开关条件更新,从而呈现新的视图:
struct OnView: View {
    
    @ObservedObject var vm: ViewModel
    
    var body: some View {
        VStack {
            Text("Welcome to On")
            Button { vm.state = .off }
                label: { Text("Toggle") }
        }
    }
}

这在单个视图中运行正常:

Toggle Single View

但是,在选项卡视图中嵌套时,更改状态会导致TabView切换选项卡:

Toggle Tab View

    TabView {
        Text("Home Tab")
            .tabItem {
                Image(systemName: "house.fill")
                Text("Home")
            }
        OnOffSwitchView()
            .tabItem {
                Image(systemName: "switch.2")
                Text("Switch")
            }
    }

有任何想法为什么会发生这种情况吗?我不确定是 (1) 我的设置有问题(管理状态更改),(2) 我在 TabView 中漏掉了某些东西,还是 (3) 这是 SwiftUI 的问题。
这个玩具示例可以在 GitHub 上找到。已更新为答案。
1个回答

3

我认为这是一个bug,因为默认属性约定应该检测到OnOffSwitchView是相同的......无论如何,引入明确的selection可以解决这个问题。

在Xcode 13.4 / iOS 15.5上进行了测试。

struct ContentView: View {

    @State private var selection = 0

    var body: some View {
        TabView(selection: $selection) {  // << preserves selected tab !!
            Text("Home Tab")
                .tabItem {
                    Image(systemName: "house.fill")
                    Text("Home")
                }.tag(0)
            OnOffSwitchView()
                .tabItem {
                    Image(systemName: "switch.2")
                    Text("Switch")
                }.tag(1)
        }
    }
}

*注意:在这种情况下,我建议在OnOffSwitchView中使用StateObject作为视图模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接