在SwiftUI中禁用或忽略TabView上的点击

3
我有一个带有TabView的应用程序。然而,在其中一个内容视图中发生特定过程时,我希望在该过程完成之前阻止用户切换选项卡。
如果我在TabView本身上使用disabled属性(使用@State绑定来驱动它),那么整个内容视图似乎都被禁用了——点击似乎无法传递到主视图上的按钮。
例如:
struct FooView: View {
    var body: some View {
        TabView {
            View1().tabItem(...)
            View2().tabItem(...)
        }
        .disabled(someStateVal)
    }
}

显然,我希望View1仍然允许用户做事情。当someStateVal为真时,整个View1不会响应。
有没有一种方法可以根据someStateVal防止切换选项卡?
谢谢!
2个回答

3
我找不到一种方法来单独禁用tabItem,所以这里提供一个示例想法,直到有更有原则性的解决方案出现。
诀窍是用透明矩形覆盖选项卡栏以捕获点击。
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)
            }
        }
    }
}

0

我使用另一个技巧。只需隐藏选项卡图像。

struct FooView: View {
    var body: some View {
        TabView {
            View1().tabItem{Image(systemName: someStateVal ? "": "globe")}
            View2().tabItem{Image(systemName: someStateVal ? "": "gearshape")}
        }
    }
}

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