15.4_处理用户在列表中的交互操作
响应列表项选择事件
在MVVM架构中,处理用户在列表中的交互操作是至关重要的一环。当用户点击列表中的某个单元格时,我们希望能够捕获这个事件并执行相应的逻辑。这通常通过UITableViewDelegate协议来实现。
- 实现
didSelectRowAt方法:在ViewController中,你需要实现UITableViewDelegate的tableView(_: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。
处理滑动删除与编辑操作
除了简单的点击,用户还可能需要执行滑动删除或编辑操作。这些交互同样需要通过UITableViewDelegate和UITableViewDataSource协议来处理。
- 实现
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%的用户表示,清晰的错误提示能显著提升他们的使用满意度。
通过这些细致的交互处理,你的列表页面将变得更加健壮和用户友好!🚀✨