删除 UITableViewCell 行后重新排序字典集
Reordering a Dictionary set upon deleting a UITableViewCell row
我决定使用字典通过 API 调用填充多个 tableView,而不是使用数组和异步等待来减少加载时间。我在后台线程中异步调用我所有的 API,为每个字典提供一个从 0 开始递增的索引,当所有 API 调用完成后,我对字典进行排序:
let sortedDictionary = dictionary.sorted {
return [=10=].key < .key
}
然后我填充我的tableView;比 运行 和 API 按顺序调用快得多。现在我必须以某种方式在删除行时对 tableViews 重新排序,就像对标准数组一样(我有一个带有多个 tableViews 的 scrollView,另一个 tableView 每个 tableView 都有一行;第二个 tableView 是我要删除行的那个).这是我的尝试,但我的逻辑有些不对劲,或者我遗漏了一些东西:
func tableView(_ tableView: UITableView, commit editingStyle:
UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete{
//delete object from dictionary
self.dictionary.removeValue(forKey: indexPath.row)
for i in indexPath.row...dictionary.count-1{
if i == dictionary.count-1{
//remove last index in the dictionary at end of loop
self.dictionary.removeValue(forKey: i)
} else{
//increment all dictionary indices past the deleted row down one
let j = i+i
let value = dictionary[j]
guard let value = value else {return}
self.dictionary.removeValue(forKey: j)
self.dictionary.updateValue(value, forKey: i)
}
}
}
}
我这里好像运行变成了空值:
guard let value = value else {return}
这不是存储字典值的正确方法吗?
let value = dictionary[j]
感谢任何帮助。谢谢!
我解决了这个问题并将其格式化为模板函数,以便它可以用于多个字典模型。正如上面的评论所说,字典可以简单地排序,但这是另一种方法:
func deleteRows<T>(indexPath: IndexPath, dictionary: inout Dictionary<Int, T>){
if indexPath.row == dictionary.count-1{
//if its the last object in the tableView, delete and return
dictionary.removeValue(forKey: indexPath.row)
return
}
//store last object in dictionary
let lastIndex = dictionary[dictionary.count-1]
for i in indexPath.row...dictionary.count-1{
if i == dictionary.count-2{
//remove last object in the dictionary at end of loop
dictionary.removeValue(forKey: dictionary.count-1)
//append last object
guard let lastIndex = lastIndex else {return}
dictionary.updateValue(lastIndex, forKey: dictionary.count-1)
} else if i < dictionary.count-1{
//increment all dictionary indices past the deleted row down one
let value = dictionary[i+i]
guard let value = value else {return}
dictionary.updateValue(value, forKey: i)
}
}
}
我决定使用字典通过 API 调用填充多个 tableView,而不是使用数组和异步等待来减少加载时间。我在后台线程中异步调用我所有的 API,为每个字典提供一个从 0 开始递增的索引,当所有 API 调用完成后,我对字典进行排序:
let sortedDictionary = dictionary.sorted {
return [=10=].key < .key
}
然后我填充我的tableView;比 运行 和 API 按顺序调用快得多。现在我必须以某种方式在删除行时对 tableViews 重新排序,就像对标准数组一样(我有一个带有多个 tableViews 的 scrollView,另一个 tableView 每个 tableView 都有一行;第二个 tableView 是我要删除行的那个).这是我的尝试,但我的逻辑有些不对劲,或者我遗漏了一些东西:
func tableView(_ tableView: UITableView, commit editingStyle:
UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete{
//delete object from dictionary
self.dictionary.removeValue(forKey: indexPath.row)
for i in indexPath.row...dictionary.count-1{
if i == dictionary.count-1{
//remove last index in the dictionary at end of loop
self.dictionary.removeValue(forKey: i)
} else{
//increment all dictionary indices past the deleted row down one
let j = i+i
let value = dictionary[j]
guard let value = value else {return}
self.dictionary.removeValue(forKey: j)
self.dictionary.updateValue(value, forKey: i)
}
}
}
}
我这里好像运行变成了空值:
guard let value = value else {return}
这不是存储字典值的正确方法吗?
let value = dictionary[j]
感谢任何帮助。谢谢!
我解决了这个问题并将其格式化为模板函数,以便它可以用于多个字典模型。正如上面的评论所说,字典可以简单地排序,但这是另一种方法:
func deleteRows<T>(indexPath: IndexPath, dictionary: inout Dictionary<Int, T>){
if indexPath.row == dictionary.count-1{
//if its the last object in the tableView, delete and return
dictionary.removeValue(forKey: indexPath.row)
return
}
//store last object in dictionary
let lastIndex = dictionary[dictionary.count-1]
for i in indexPath.row...dictionary.count-1{
if i == dictionary.count-2{
//remove last object in the dictionary at end of loop
dictionary.removeValue(forKey: dictionary.count-1)
//append last object
guard let lastIndex = lastIndex else {return}
dictionary.updateValue(lastIndex, forKey: dictionary.count-1)
} else if i < dictionary.count-1{
//increment all dictionary indices past the deleted row down one
let value = dictionary[i+i]
guard let value = value else {return}
dictionary.updateValue(value, forKey: i)
}
}
}