List|使用原生 selection 机制

学习如何在 SwiftUI 中使用 List 组件的原生 selection 机制实现高效的列表选择功能。

List|使用原生 selection 机制

SwiftUI 的 List 组件原生支持选择功能,只需使用 selection 添加绑定即可。

List(items, selection: $selectedItem) { item in
    Text(item.name)
}

除了使用 $ 添加双向绑定,也支持 getset 自定义绑定:

避免使用 onTapGesture

应当优先使用 selection 方法,避免使用 .onTapGesture 来实现选择功能。

使用 .onTapGesture 会导致多个问题,例如修饰器冲突(如 .onMove 方法无法工作),还会缺失 List 默认已选项的颜色标识功能。

NavigationLink vs selection

在实践中,List 也经常和 NavigationLink 结合使用。

使用 NavigationLink 的情况(导航跳转)

  • 每个列表项都有对应的详情页面
  • 用户点击的主要目的是查看更多信息

使用 selection 的情况(选择操作)

  • 需要多选功能
  • 选择后要执行操作(删除、移动、分享等)
  • 选择本身就是目的,而非导航

实践建议

  • 移动端优先考虑 NavigationLink:移动设备上导航跳转更符合用户习惯
  • 桌面端多考虑 selection:桌面应用中选择操作更常见

选定项的背景色

默认蓝色背景

List 的 selection 会为已选项添加默认的蓝色背景,该功能不支持关闭

在 Keynote 应用中,也具有相同的特征:

自定义背景色

可以使用 .listRowBackground 设置颜色:

避免设置透明度

由于本质是在默认的 Background 上叠加颜色,因此建议将 opacity 设置为 1.0,否则就会出现颜色叠加。

以下是设置 red.opacity(0.15)的效果: