如何将某个项目设置为禁用(不可点击)但在我的 tabView 中可见?
TabView(selection: $selectedTab) {
Settings()
.tabItem {
Image(systemName: "gearshape.fill")
Text("Settings")
}.tag(1)
.disabled(true) // Not Working
我只是创建一种方法来完成您想要的完全支持和可定制的操作!
使用 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")}}
现在没有直接的 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)
}
}
}
更新了代码以禁用多个选项卡
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 }
}
}
}