0

我有一个非常普通的应用程序,带有TabView. 但是,当某个内容视图中发生特定过程时,我想阻止用户切换选项卡,直到该过程完成。

如果我disabled在其自身上使用该属性TabView(使用@State绑定来驱动它),那么整个内容视图似乎被禁用 - 水龙头似乎没有通过主视图上的按钮。

例子:

struct FooView: View {
    var body: some View {
        TabView {
            View1().tabItem(...)
            View2().tabItem(...)
        }
        .disabled(someStateVal)
    }
}

显然,我希望View1仍然允许用户,你知道,做事。当someStateVal为真时,整体View1没有反应。

有没有办法防止基于更改标签someStateVal

谢谢!

4

1 回答 1

0

I could not find a way to individually disable a tabItem, so here is an example idea until someone comes up with more principled solution.

The trick is to cover the tab bar with a clear rectangle to capture the taps.

struct ContentView: View {
    @State var isBusy = false
    
    var body: some View {
        ZStack {
            TabView {
                TestView(isBusy: $isBusy)
                    .tabItem {Image(systemName: "globe")}
                Text("textview 2")
                    .tabItem {Image(systemName: "info.circle")}
                Text("textview 3")
                    .tabItem {Image(systemName: "gearshape")}
            }
            VStack {
                Spacer()
                if isBusy {
                    Rectangle()
                        .fill(Color.white.opacity(0.001))
                        .frame(width: .infinity, height: 50)
                }
            }
        }
    }
}

struct TestView: View {
    @Binding var isBusy: Bool
    
    var body: some View {
        VStack {
            Text("TestView")
            Button(action: {
                isBusy.toggle()
            }) {
                Text("Busy \(String(isBusy))").frame(width: 170, height: 70)
            }
        }
    }
}
于 2021-05-05T07:31:30.457 回答