如何在SwiftUI List中实现点击触发动作并模拟选中后自动取消?
SwiftUI List单元格实现按压高亮+点击触发动作的解决方案
需求场景
在SwiftUI的List中展示歌曲列表,要求点击单元格时满足:
- 按压状态下单元格高亮
- 释放后取消高亮
- 同时触发歌曲播放动作
这个需求在UIKit中可以轻松实现,但SwiftUI里暂未找到原生直接方案。
尝试过的不理想方案
- 使用
List(selection)+.onChange(of: selection):需要通过UUID匹配对应歌曲,且选中状态无法自动取消,不符合需求。 - 使用
.onTapGesture修饰符:仅点击单元格内文本区域才会触发事件,且无原生按压高亮反馈,交互体验差。
最终实现方案
通过ZStack结合隐藏的Button实现需求,封装成ViewModifier扩展后,可便捷为任意单元格添加点击事件,同时获得原生按压高亮效果:
struct SelectionView: ViewModifier { let onSelect: () -> Void func body(content: Content) -> some View { ZStack (alignment: .leading) { Button { onSelect() } label: { content .hidden() } content } } } extension View { func onSelection(_ selection: @escaping () -> Void) -> some View { self.modifier(SelectionView(onSelect: selection)) } }
使用方式
直接给自定义单元格添加.onSelection修饰符即可:
SongCell(song: song) .onSelection { // 执行播放等自定义动作 }
疑问
目前疑惑苹果为何未为这种基础交互场景提供原生支持,若有官方原生实现方案,欢迎告知。
内容的提问来源于stack exchange,提问作者justaguy
相关产品推荐
相关产品推荐

