我尝试在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,但它没有解释如何在其中一个视图中运行代码。
有什么建议吗?
1条答案
按热度按时间huus2vyu1#
你可以在一个数组中记录额外的点击(相同值)。数组计数给你在同一个标签上的点击数。
EDIT:现在具有显式子视图结构。