SwiftUI:如何在.searchable激活时隐藏TagView组件?
解决SwiftUI搜索栏点击时隐藏标签的问题
要实现点击.searchable搜索栏时隐藏TagView,不能直接给.searchable加.onTapGesture(它是修饰符而非视图,手势不会生效),可以用以下两种可靠方式解决:
方法一:利用.searchable的编辑状态回调
直接在.searchable中添加编辑状态变化的处理逻辑,当搜索栏被激活时隐藏标签,结束编辑且无搜索内容时恢复显示:
修改你的.searchable修饰符:
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always), onEditingChanged: { isEditing in if isEditing { // 搜索栏被点击激活,隐藏标签 showingTags = false } else { // 结束编辑且搜索文本为空时,恢复显示标签 if searchText.isEmpty { showingTags = true } } })
方法二:用@FocusState跟踪搜索栏焦点
通过焦点状态变量绑定搜索栏,监听焦点变化来控制标签显示:
- 在视图中新增焦点状态变量:
@FocusState private var isSearchFieldFocused: Bool
- 修改搜索栏相关代码:
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always)) .focused($isSearchFieldFocused) .onChange(of: isSearchFieldFocused) { isFocused in if isFocused { showingTags = false } else { if searchText.isEmpty { showingTags = true } } }
额外优化
你现有代码中,product_array_status_search对应的视图里有.onAppear { showingTags.toggle() },这会和搜索状态的控制逻辑冲突,建议移除这行代码,统一由搜索状态管理标签的显示/隐藏。
内容的提问来源于stack exchange,提问作者Mxyb
相关产品推荐
相关产品推荐

