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)
        }
    }
}