iOS:表格视图中的多个选择
第3部分。在iOS开发中继续采用MVVM
这是我的MVVM系列表视图中的第三个教程。 在前两部分中,我们使用不同类型的动态单元格创建了表视图,并添加了可折叠部分功能。 今天,我们将介绍另一个常用的“表视图”方案:多个选择。
在许多用例中,我们需要创建一个表视图,该表视图允许用户选择多个单元格。 通常,API提供您在表视图中显示的项目列表,用户可以选择一些项目以便以后使用(发送到后端,保存到本地存储,传递到下一个屏幕等) 。 有时,您希望将选择限制在一定数量之内,或者您不希望用户继续选择任何项。
这是我通常在现有应用程序中或在stackoverflow的一些答案中看到的内容:
让allItems = [Items]()
var selectedItems = [Items]()
然后,当选择了单元格时,就可以通过这种方式在所选索引处添加或删除项目。
另一个解决方案稍微好一点:获取当前选定的TableView行的索引,然后将其映射到数据源项的数组:
如果让selectedIndexes = tableView.indexPathsForSelectedRows {
//将索引映射到现有数据数组的棘手方法
//让selectedItems = ...
}
尽管第二种方法对于TableView来说更自然,因为它利用了内置方法indexPathsForSelectedRows,但如果要将ViewModel与View分开,仍然不是完美的选择。 将tableView索引映射到模型项是我们要避免的Massive View Controller模式的一个很好的例子。
如果要在重新加载tableView时保留选择,这将变得更加混乱:您需要保存当前选定的索引,重新加载tableView ,然后为每个选定的索引调用selectRow 。 但是两次重装之间dataSource发生了什么变化?
完成本教程后, TableViewController中将包含以下代码来处理多行选择:
//什么代码?
那就对了。 完全没有代码。 一切将由ViewModel和TableViewDelegate处理 。 当您重新加载整个TableView或其任何部分时,选择将保持不变 。
听起来不错? 开始吧!