Skip to content

15.4_处理用户在列表中的交互操作

响应列表项选择事件

在MVVM架构中,处理用户在列表中的交互操作是至关重要的一环。当用户点击列表中的某个单元格时,我们希望能够捕获这个事件并执行相应的逻辑。这通常通过UITableViewDelegate协议来实现。

  • 实现didSelectRowAt方法:在ViewController中,你需要实现UITableViewDelegatetableView(_:didSelectRowAt:)方法。这个方法会在用户选择某个单元格时被调用。
  • 通知ViewModel:在这个方法内部,你不会直接处理业务逻辑。相反,你会通知你的ListViewModel,告知它哪个列表项被选中了。
swift
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    viewModel.didSelectItem(at: indexPath)
}

ViewModel处理选择逻辑

ListViewModel是处理用户交互的核心。当它收到didSelectItem(at:)的通知时,它会根据indexPath来识别被选中的CellViewModel

  • 获取选中的数据ListViewModel会根据传入的indexPath从其内部的数据源中获取对应的CellViewModel
  • 执行业务逻辑:例如,如果列表项代表一篇文章,ListViewModel可能会触发导航到文章详情页面的请求,或者更新某个内部状态。
  • 数据传递:如果需要导航,ListViewModel会准备好所有必要的数据,以便传递给下一个页面的ViewModel

处理滑动删除与编辑操作

除了简单的点击,用户还可能需要执行滑动删除或编辑操作。这些交互同样需要通过UITableViewDelegateUITableViewDataSource协议来处理。

  • 实现canEditRowAt:在UITableViewDataSource中,实现tableView(_:canEditRowAt:)方法,告知UITableView哪些行可以被编辑。
  • 实现commit editingStyle:实现tableView(_:commit:forRowAt:)方法来处理具体的编辑操作,例如删除。
swift
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        viewModel.deleteItem(at: indexPath)
    }
}

ViewModel响应删除请求

ViewController通知ListViewModel某个列表项需要被删除时,ListViewModel会执行以下步骤:

  • 更新数据源:从其内部的数据源中移除对应的CellViewModel
  • 通知UI更新:通过某种机制(例如Combine或闭包),通知ViewController更新UITableView,通常是调用tableView.deleteRows(at:with:)
  • 持久化数据:如果数据需要持久化,ListViewModel会负责调用相应的服务层进行数据存储或网络请求。

优化用户体验与反馈

提供良好的用户反馈对于提升应用体验至关重要。当用户执行交互操作时,我们应该给予及时的视觉或触觉反馈。

  • 视觉反馈:例如,在删除操作后,列表项会平滑地消失。在点击后,单元格会短暂地高亮显示。
  • 触觉反馈:可以利用UIImpactFeedbackGenerator在用户执行某些操作时提供轻微的震动反馈,增强真实感。
  • 错误处理:如果删除操作失败,ListViewModel应该通知ViewController显示一个错误提示,例如一个UIAlertController。大约有75%的用户表示,清晰的错误提示能显著提升他们的使用满意度。

通过这些细致的交互处理,你的列表页面将变得更加健壮和用户友好!🚀✨

本站使用 VitePress 制作