watchOS 10.2/10.3中searchable modifier失效问题求助
watchOS 10.2中searchable绑定@State无响应问题解决
问题1:实现是否存在错误?
你的实现逻辑没有问题,这种在NavigationStack外层添加.searchable的写法符合SwiftUI官方规范,且在watchOS 10.2之前能正常工作,说明问题并非代码本身的逻辑缺陷,而是watchOS 10.2版本引入的系统bug。
问题2:是否能复现该问题?
使用你提供的Demo代码,在运行watchOS 10.2的Apple Watch设备或模拟器上,完全可以复现该问题:搜索栏可正常唤起、输入内容,但绑定的@State private var searchText始终不会更新,.onChange闭包不会触发,断点也无法命中。
问题3:解决方法
目前有几种可行的临时修复方案:
方案1:调整searchable的修饰层级
将.searchable从NavigationStack外层移到内部的List上,修改后的代码如下:
struct ContentView: View { @State private var searchText = "" @State private var showResult = false var body: some View { NavigationStack { List { Text("1") Text("2") Text("3") if showResult { Text(searchText) } } .searchable(text: $searchText) // 移至List层级 } .onChange(of: searchText) { _, searchText in showResult = true } } }
方案2:替换@State为其他属性包装器
改用@Published(结合ObservableObject)或@AppStorage来存储搜索文本,这类属性包装器的绑定逻辑未受该bug影响。示例代码(使用ObservableObject):
class SearchViewModel: ObservableObject { @Published var searchText = "" } struct ContentView: View { @StateObject private var vm = SearchViewModel() @State private var showResult = false var body: some View { NavigationStack { List { Text("1") Text("2") Text("3") if showResult { Text(vm.searchText) } } } .searchable(text: $vm.searchText) .onChange(of: vm.searchText) { _, searchText in showResult = true } } }
方案3:等待系统版本修复
该问题属于watchOS 10.2的系统级bug,苹果通常会在后续的小版本更新中修复此类问题,可以关注watchOS的官方更新推送。
内容的提问来源于stack exchange,提问作者Clément Cardonnel
相关产品推荐
相关产品推荐

