TabView, tabItem: 运行 选择代码或添加 onTapGesture
TabView, tabItem: running code on selection or adding an onTapGesture
当我在 tabview 中的一个选项卡被选中时,我想 运行 一些代码。
假设:我想创建一个应用程序,目的是:A) 使用 tabview 和 B) 严重混淆用户。为此,我将创建一个应用程序,其中包含选项卡“一”、“二”和“三”,以及视图“一”、“二”和“三”。 Then, when the second tab is selected, I will change view "two" to say "one" instead.恶魔般的。
一个常识性的解决方案是这样的:
import SwiftUI
struct ContentView: View {
@State private var two : String = "Two"
var body: some View {
TabView() {
Text("One")
.tabItem {
Text("One")
}
Text("Two")
.tabItem {
Text(two)
}
.onTapGesture {
print("Tapped!!")
self.two = "One"
}
Text("Three")
.tabItem {
Text("Three")
}
}
}
}
不幸的是,这与普通应用程序完全一样,并且不会混淆用户,因为两个未更新(并且控制台中没有“Tapped!”)。
如何在选择或点击 tabItem 时 运行 编码?这可能是更新变量、运行设置动画或其他任何内容。
这是一个解决方案 - 您可以观察选项卡选择的变化并做出相应的反应。
测试 Xcode 12 / iOS 14
import Combine // << needed for Just publisher below
struct ContentView: View {
@State private var two : String = "Two"
@State private var selection: Int = 1
var body: some View {
TabView(selection: $selection) {
Text("One")
.tabItem {
Text("One")
}.tag(1)
Text("Two")
.tabItem {
Text(two)
}.tag(2)
Text("Three")
.tabItem {
Text("Three")
}.tag(3)
}
// .onChange(selection) { // << if SwiftUI 2.0 min spec
.onReceive(Just(selection)) {
print("Tapped!!")
if [=10=] == 2 {
self.two = "One"
}
}
}
}
当我在 tabview 中的一个选项卡被选中时,我想 运行 一些代码。
假设:我想创建一个应用程序,目的是:A) 使用 tabview 和 B) 严重混淆用户。为此,我将创建一个应用程序,其中包含选项卡“一”、“二”和“三”,以及视图“一”、“二”和“三”。 Then, when the second tab is selected, I will change view "two" to say "one" instead.恶魔般的。
一个常识性的解决方案是这样的:
import SwiftUI
struct ContentView: View {
@State private var two : String = "Two"
var body: some View {
TabView() {
Text("One")
.tabItem {
Text("One")
}
Text("Two")
.tabItem {
Text(two)
}
.onTapGesture {
print("Tapped!!")
self.two = "One"
}
Text("Three")
.tabItem {
Text("Three")
}
}
}
}
不幸的是,这与普通应用程序完全一样,并且不会混淆用户,因为两个未更新(并且控制台中没有“Tapped!”)。
如何在选择或点击 tabItem 时 运行 编码?这可能是更新变量、运行设置动画或其他任何内容。
这是一个解决方案 - 您可以观察选项卡选择的变化并做出相应的反应。
测试 Xcode 12 / iOS 14
import Combine // << needed for Just publisher below
struct ContentView: View {
@State private var two : String = "Two"
@State private var selection: Int = 1
var body: some View {
TabView(selection: $selection) {
Text("One")
.tabItem {
Text("One")
}.tag(1)
Text("Two")
.tabItem {
Text(two)
}.tag(2)
Text("Three")
.tabItem {
Text("Three")
}.tag(3)
}
// .onChange(selection) { // << if SwiftUI 2.0 min spec
.onReceive(Just(selection)) {
print("Tapped!!")
if [=10=] == 2 {
self.two = "One"
}
}
}
}