【发布时间】:2023-01-29 23:37:46
【问题描述】:
当用户多次点击同一个选项卡时,我试图在 TabView 中实现该行为,例如在 iOS AppStore 应用程序中。第一次点击:切换到该视图,第二次点击:弹出到根,第三次点击:如果需要滚动到顶部。
下面的代码适用于切换,每次点击都会调用didTap()。
import SwiftUI
enum Tab: String {
case one
case two
}
struct AppView: View {
@State private var activeTab = Tab.one
var body: some View {
TabView(selection: $activeTab.onChange(didTap)) {
One()
.tabItem {
Label("one", systemImage: "1.lane")
}
.tag(Tab.one)
Two()
.tabItem {
Label("two", systemImage: "2.lane")
}
.tag(Tab.two)
}
}
func didTap(to value: Tab) {
print(value) // this captures every tap
}
}
extension Binding {
func onChange(_ handler: @escaping (Value) -> Void) -> Binding<Value> {
Binding(
get: { self.wrappedValue },
set: { newValue in
self.wrappedValue = newValue
handler(newValue)
}
)
}
}
我正在努力解决的问题是如何告诉One 或Two 它被第二次或第三次窃听了? (如何弹出和滚动不是问题)。
我看过这个:TabView, tabItem: running code on selection or adding an onTapGesture 但它没有解释如何在其中一个视图中运行代码。
有什么建议么?
【问题讨论】: