禁用 TabView SwiftUI 中的项目

问题描述 投票:0回答:3

如何将某个项目设置为禁用(不可点击)但在我的 tabView 中可见?

TabView(selection: $selectedTab) {
            Settings()
                .tabItem {
                    Image(systemName: "gearshape.fill")
                    Text("Settings")
                }.tag(1)
                 .disabled(true) // Not Working
          
swiftui tabview
3个回答
6
投票

我只是创建一种方法来完成您想要的完全支持和可定制的操作!

使用 Xcode 版本 12.1、iOS 14.1 进行测试,如下:

    import SwiftUI

struct ContentView: View {
    

    @State private var selection = 0
    @State private var exSelection = 0
    private var disableThis = 2
    
    
    
    var body: some View
    {
        TabView(selection: $selection)
        {
            viewFinder(selectedIndex: selection == disableThis ? $exSelection : $selection)
                .tabItem { Image(systemName: "1.circle") }
                .tag(0)
            
            
            viewFinder(selectedIndex: selection == disableThis ? $exSelection : $selection)
                .tabItem { Image(systemName: "2.circle") }
                .tag(1)
            
            viewFinder(selectedIndex: selection == disableThis ? $exSelection : $selection)
                .tabItem { Image(systemName: "3.circle") }
                .tag(2)
            
            viewFinder(selectedIndex: selection == disableThis ? $exSelection : $selection)
                .tabItem { Image(systemName: "4.circle") }
                .tag(3)
        }
        .onAppear()
        {
            UITabBar.appearance().barTintColor = .white
        }
        .accentColor(selection == disableThis ? Color.gray : Color.red)
        .onChange(of: selection) { _ in
            if selection != disableThis { exSelection = selection } else { selection = exSelection }
        }
        
        
    }
    
    
    
}





struct viewFinder: View
{
    
    @Binding var selectedIndex: Int
    
    var body: some View {
        
        
        return Group
        {
            if      selectedIndex == 0
            {
                FirstView()
            }
            else if selectedIndex == 1
            {
                SecondView()
            }
            else if selectedIndex == 2
            {
                ThirdView()
            }
            else if selectedIndex == 3
            {
                FourthView()
            }
            else
            {
                EmptyView()
            }
        }
        

        
    }
    
}


struct FirstView: View { var body: some View {Text("FirstView")}}
struct SecondView: View { var body: some View {Text("SecondView")}}
struct ThirdView: View { var body: some View {Text("ThirdView")}}
struct FourthView: View { var body: some View {Text("FourthView")}}


1
投票

现在没有直接的 SwiftUI 工具(SwiftUI 2.0),因此根据我的另一个答案中的

TabBarAccessor
找到以下可能的方法https://stackoverflow.com/a/59972635/12299030

使用 Xcode 12.1 / iOS 14.1 进行测试(注意 - 色调颜色仅针对演示而更改,因为禁用的项目为灰色且在灰色选项卡栏上不可见)

struct TestTabBar: View {
    init() {
        UITabBar.appearance().unselectedItemTintColor = UIColor.green
    }
    @State private var selection = 0
    var body: some View {
        TabView(selection: $selection) {
            Text("First View")
                .background(TabBarAccessor { tabBar in
                    tabBar.items?.last?.isEnabled = false     // << here !!
                })
                .tabItem { Image(systemName: "1.circle") }
                .tag(0)
            Text("Second View")
                .tabItem { Image(systemName: "2.circle") }
                .tag(1)
        }
    }
}

0
投票

更新了代码以禁用多个选项卡

struct ContentView: View {
    
    
    @State private var selection = 0
    @State private var exSelection = 0
    private var disableThis = [2, 3]
    
    
    
    var body: some View
    {
        TabView(selection: $selection)
        {
            viewFinder(selectedIndex: disableThis.contains(selection) ? $exSelection : $selection)
                .tabItem { Image(systemName: "1.circle") }
                .tag(0)
            
            
            viewFinder(selectedIndex: disableThis.contains(selection) ? $exSelection : $selection)
                .tabItem { Image(systemName: "2.circle") }
                .tag(1)
            
            viewFinder(selectedIndex: disableThis.contains(selection) ? $exSelection : $selection)
                .tabItem { Image(systemName: "3.circle") }
                .tag(2)
            
            viewFinder(selectedIndex: disableThis.contains(selection) ? $exSelection : $selection)
                .tabItem { Image(systemName: "4.circle") }
                .tag(3)
        }
        .onAppear()
        {
            UITabBar.appearance().barTintColor = .white
        }
        .accentColor(disableThis.contains(selection) ? Color.gray : Color.red)
        .onChange(of: selection) { _ in
            if !disableThis.contains(selection) { exSelection = selection } else { selection = exSelection }
        }
        
        
    }  
}
© www.soinside.com 2019 - 2024. All rights reserved.