最近在折腾 iOS 开发的时候,想实现在切换 TabView 的 tab 时触发震动反馈,因为一边写一边学嘛,基础不牢,只能在网上瞎搜,试了各种方法都不奏效。直到前两天看到 Ice Cubes: for Mastodon 的这段代码,豁然开朗。

之前写的时候,只知道给 selection 传一个绑定的对象,但是看完 IceCubes 的代码,再一看 selection 参数的文档,恍然大悟,这个参数要的其实是一个 SelectionValue 的绑定对象,所以我其实可以在这个对象的 set 方法上面做文章。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct ContentView: View {
@State
private var selectedTab = Tab.Timeline

var body: some View {
TabView(selection: .init(
get: {
selectedTab
},
set: { newTab in
selectedTab = newTab

// 在TabView更新selection的时候触发震动反馈就行了
if (globalState.isHapticFeedbackEnabled) {
HapticsHelper.playHapticFeedback()
}
}
)) {
// Views
}
}
}

顺便提一嘴我之前走过的一个弯路,就是试图在 TabView 上用.onTapGesture() 方法,结果虽然能震了,但是 tab 不会切换,当时还花了好长时间找怎么调用原本的.onTapGesture() 来切 tab,当然最后一无所获,最后认输,把震动反馈这个功能忍痛砍了……