Swift中如何在UITableView的numberOfRowsInSection获取字典对应key的数组元素数
实现对应section数组元素个数获取方法
Swift中的字典[Int: [TaskEntity]]是无序结构,你需要先对key做升序排序,让排序后的key下标与tableView的section索引一一对应,再通过对应key获取数组长度即可,完整实现代码如下:
// 建议单独缓存排序后的key,避免每次代理方法重复排序 var sortedTaskKeys: [Int] = [] var tasks = [Int :[TaskEntity]]() // 实现分组数代理方法 func numberOfSections(in tableView: UITableView) -> Int { return sortedTaskKeys.count } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 安全校验,避免数组越界 guard section < sortedTaskKeys.count, let taskList = tasks[sortedTaskKeys[section]] else { return 0 } return taskList.count }
每次修改tasks字典后,同步更新排序key再刷新列表:
sortedTaskKeys = tasks.keys.sorted() tableView.reloadData()
打印结果异常原因与解决方案
原因
你看到的多次打印是tableView代理的正常调用逻辑:
- 第一次输出空key数组是
tasks字典还未完成赋值时,tableView初始加载触发的代理回调 - 给
tasks新增key后调用刷新方法,会触发第二次代理回调,此时字典已经有对应key - 新增第1个section后字典包含2个key,tableView会依次查询所有存在的section的行数,所以会依次输出section=1和section=0的日志
解决方案
- 所有对
tasks字典的修改操作完成后,再执行tableView的刷新逻辑,避免修改前触发无效回调 - 优先使用局部刷新代替全局
reloadData减少不必要的代理调用,新增分组时使用以下代码:
tableView.insertSections(IndexSet(integer: newSectionIndex), with: .automatic)
- 若不需要调试时关闭print语句即可,该调用逻辑本身不会影响功能正常运行
内容的提问来源于stack exchange,提问作者Babylon Research
相关产品推荐
相关产品推荐

