SwiftUI TabView 如何在第二次点击标签时加载更多数据
SwiftUI TabView how can I load more data on 2nd tab click
我正在使用 TabView 并希望在用户第二次单击同一选项卡项时添加更多数据。我一直在查看其他示例,例如 SwiftUI TabView On Click Action,但是我无法使其正常工作。我在下面有一个简单的例子(完整代码)。基本上,如果标签已经在 MainView 上并且用户再次单击它,我想点击 print("Update get more data") 代码。我使用了 OnReceive 方法,但如果在同一选项卡中单击超过 1 次,该方法将不起作用。我也尝试在 TabView 之外使用 onTapGesture,但似乎没有绑定任何建议,因为我正在学习 SwiftUI 并且我使用的是 3.0
版
*TabView(selection: $selectedTab) {
...
}.onTapGesture {
print(selectedTab) // This always give MainView
}*
我也试过上面的,它总是给 MainView
import SwiftUI
import Combine
struct TabViews: View {
@State var selectedTab: Tab = .MainView
@State private var firstPass = false
var body: some View {
TabView(selection: $selectedTab) {
Text("Main View")
.padding()
.tabItem {
Image(systemName: "1.circle")
Text("First")
}
.tag(Tab.MainView)
Text("Menu View")
.padding()
.tabItem {
Image(systemName: "2.circle")
Text("Second")
}
.tag(Tab.MenuView)
}
.onReceive(Just(selectedTab)) {
print("Tapped!! \(selectedTab)")
if [=11=] == .MainView {
if firstPass == true {
// update list
print("Update get more data")
}
firstPass = true
}
if [=11=] == .MenuView {
print("2")
}
}
}
}
extension TabViews {
enum Tab: Hashable {
case MainView
case MenuView
case RankingView
}
}
struct TabView_Previews: PreviewProvider {
static var previews: some View {
TabViews()
}
}
对于您的方案,解决方案是使用代理绑定(拦截每次点击),如参考问题中第二个 link 所示。
测试 Xcode 13 / iOS 15
struct TabViews: View {
@State var selectedTab: Tab = .MainView
@State private var firstPass = false
private var selection: Binding<Tab> { Binding( // << this !!
get: { selectedTab },
set: {
selectedTab = [=10=]
print("Tapped!! \(selectedTab)")
if [=10=] == .MainView {
if firstPass == true {
// update list
print("Update get more data")
firstPass = false // << reset !!
return
}
firstPass = true
}
if [=10=] == .MenuView {
print("2")
firstPass = false
}
}
)}
var body: some View {
TabView(selection: selection) { // << here !!
Text("Main View")
.padding()
.tabItem {
Image(systemName: "1.circle")
Text("First")
}
.tag(Tab.MainView)
Text("Menu View")
.padding()
.tabItem {
Image(systemName: "2.circle")
Text("Second")
}
.tag(Tab.MenuView)
}
}
}
我正在使用 TabView 并希望在用户第二次单击同一选项卡项时添加更多数据。我一直在查看其他示例,例如 SwiftUI TabView On Click Action,但是我无法使其正常工作。我在下面有一个简单的例子(完整代码)。基本上,如果标签已经在 MainView 上并且用户再次单击它,我想点击 print("Update get more data") 代码。我使用了 OnReceive 方法,但如果在同一选项卡中单击超过 1 次,该方法将不起作用。我也尝试在 TabView 之外使用 onTapGesture,但似乎没有绑定任何建议,因为我正在学习 SwiftUI 并且我使用的是 3.0
版 *TabView(selection: $selectedTab) {
...
}.onTapGesture {
print(selectedTab) // This always give MainView
}*
我也试过上面的,它总是给 MainView
import SwiftUI
import Combine
struct TabViews: View {
@State var selectedTab: Tab = .MainView
@State private var firstPass = false
var body: some View {
TabView(selection: $selectedTab) {
Text("Main View")
.padding()
.tabItem {
Image(systemName: "1.circle")
Text("First")
}
.tag(Tab.MainView)
Text("Menu View")
.padding()
.tabItem {
Image(systemName: "2.circle")
Text("Second")
}
.tag(Tab.MenuView)
}
.onReceive(Just(selectedTab)) {
print("Tapped!! \(selectedTab)")
if [=11=] == .MainView {
if firstPass == true {
// update list
print("Update get more data")
}
firstPass = true
}
if [=11=] == .MenuView {
print("2")
}
}
}
}
extension TabViews {
enum Tab: Hashable {
case MainView
case MenuView
case RankingView
}
}
struct TabView_Previews: PreviewProvider {
static var previews: some View {
TabViews()
}
}
对于您的方案,解决方案是使用代理绑定(拦截每次点击),如参考问题中第二个 link 所示。
测试 Xcode 13 / iOS 15
struct TabViews: View {
@State var selectedTab: Tab = .MainView
@State private var firstPass = false
private var selection: Binding<Tab> { Binding( // << this !!
get: { selectedTab },
set: {
selectedTab = [=10=]
print("Tapped!! \(selectedTab)")
if [=10=] == .MainView {
if firstPass == true {
// update list
print("Update get more data")
firstPass = false // << reset !!
return
}
firstPass = true
}
if [=10=] == .MenuView {
print("2")
firstPass = false
}
}
)}
var body: some View {
TabView(selection: selection) { // << here !!
Text("Main View")
.padding()
.tabItem {
Image(systemName: "1.circle")
Text("First")
}
.tag(Tab.MainView)
Text("Menu View")
.padding()
.tabItem {
Image(systemName: "2.circle")
Text("Second")
}
.tag(Tab.MenuView)
}
}
}