我正在尝试用SwiftUI实现这样一个功能:当你在一个选项卡上按下按钮后,它会切换到另一个选项卡。如果是在UIKit中,我会这样做:
if [condition...button pressed] {
self.tabBarController!.selectedIndex = 2
}
但是在SwiftUI中有没有实现这个功能的等价方法?
您只需要更新一个负责选择的@State
变量。但是,如果您想从子视图中进行操作,可以将其作为@Binding
变量传递:
struct ContentView: View {
@State private var tabSelection = 1
var body: some View {
TabView(selection: $tabSelection) {
FirstView(tabSelection: $tabSelection)
.tabItem {
Text("Tab 1")
}
.tag(1)
Text("tab 2")
.tabItem {
Text("Tab 2")
}
.tag(2)
}
}
}
struct FirstView: View {
@Binding var tabSelection: Int
var body: some View {
Button(action: {
self.tabSelection = 2
}) {
Text("Change to tab 2")
}
}
}
@SceneStorage("selectedView") var selectedView: String?
var body: some View {
TabView (selection: $selectedView){
NavigationView {
TimerView()
}
.tag(TimerView.tag)
.tabItem {
Image(systemName: "stopwatch.fill")
Text("Timer")
}...
然后,在更深入的视图中的任何地方:
Button(action: {
selectedView = TimerView.tag
}) {
Text("Switch Tab")
}
TimerView.tag在示例中只是常量,以避免在整个应用程序中使用字符串:
static let tag: String? = "Timer"
一旦您更新@SceneStorage值,SwiftUI将处理选项卡切换,并保存应用中最后打开的选项卡。