iOS:表格视图中的多个选择

第3部分。在iOS开发中继续采用MVVM

这是我的MVVM系列表视图中的第三个教程。 在前两部分中,我们使用不同类型的动态单元格创建了表视图,并添加了可折叠部分功能。 今天,我们将介绍另一个常用的“表视图”方案:多个选择。

在许多用例中,我们需要创建一个表视图,该表视图允许用户选择多个单元格。 通常,API提供您在表视图中显示的项目列表,用户可以选择一些项目以便以后使用(发送到后端,保存到本地存储,传递到下一个屏幕等) 。 有时,您希望将选择限制在一定数量之内,或者您不希望用户继续选择任何项。

这是我通常在现有应用程序中或在stackoverflow的一些答案中看到的内容:

 让allItems = [Items]() 
var selectedItems = [Items]()

然后,当选择了单元格时,就可以通过这种方式在所选索引处添加或删除项目。

另一个解决方案稍微好一点:获取当前选定的TableView行的索引,然后将其映射到数据源项的数组:

 如果让selectedIndexes = tableView.indexPathsForSelectedRows { 
  //将索引映射到现有数据数组的棘手方法 
//让selectedItems = ...
}

尽管第二种方法对于TableView来说更自然,因为它利用了内置方法indexPathsForSelectedRows,但如果要将ViewModelView分开仍然不是完美的选择。 将tableView索引映射到模型项是我们要避免的Massive View Controller模式的一个很好的例子。

如果要在重新加载tableView时保留选择,这将变得更加混乱您需要保存当前选定的索引,重新加载tableView ,然后为每个选定的索引调用selectRow 。 但是两次重装之间dataSource发生了什么变化?

完成本教程后, TableViewController中将包含以下代码来处理多行选择:

  //什么代码? 

那就对了。 完全没有代码。 一切将由ViewModelTableViewDelegate处理 。 当您重新加载整个TableView或其任何部分时,选择将保持不变

听起来不错? 开始吧!