我对Swift很新,我正在开发第一个应用程序。我目前正在使用UITableView,当用户点击它时,该选项会在右侧显示复选标记。它工作正常,但无论何时向下滚动项目列表,复选标记都会消失。我查了几个在线资源,但我不确定如何将它应用到我的代码中。任何帮助将不胜感激!
另外,有什么方法可以存储用户重新打开应用程序时的复选标记吗?每次我重新启动应用程序时,检查列表都会重置。
这是我到目前为止的代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "celltwo")
cell.textLabel?.text = list[indexPath.row]
return(cell)
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCellAccessoryType.checkmark
{
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none
}
else
{
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark
}
tableView.deselectRow(at: indexPath, animated: true)
}
答案 0 :(得分:0)
滚动时复选标记正在消失,因为表视图会重复使用单元格,因此每当您滚动时都会调用'cellForRowAt'方法,并且您没有提供显示/隐藏此方法中的复选标记的逻辑。要解决此问题,您可以执行以下操作,
初始化数组以存储所选单元格的索引。
var selectedIndexes : [Int] = []
使用在'selectedIndexes'数组中添加/删除索引的逻辑更新'didSelectRowAt'方法。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCellAccessoryType.checkmark
{
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none
let indexOfItemToRemove = self.selectedIndexes.index(of: list[indexPath.row])
self.selectedIndexes.remove(at: indexOfItemToRemove)
}
else
{
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark
self.selectedIndexes.append(indexPath.row)
}
}
使用显示/隐藏复选标记的逻辑更新'cellForRowAt'方法。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "celltwo")
cell.textLabel?.text = list[indexPath.row]
if self.selectedIndexes.contains(indexPath.row)
{
//cell was selected earlier
cell.accessoryType = UITableViewCellAccessoryType.checkmark
}else
{
// cell was not selected earlier
cell.accessoryType = UITableViewCellAccessoryType.none
}
return cell
}
为了保存下次启动应用程序时的选择,您可以将“selectedIndexes”数组保存到UserDefaults。为了实现这一目标,请执行以下操作:
更新'didSelectRowAt'方法以包含将所选索引保存到UserDefaults的逻辑。在方法结尾处的以下代码中。
let userDefaults = UserDefaults.standard
userDefaults.set(selectedIndexes, forKey: "SelectedIndexes")
将以下代码添加到'viewDidLoad'方法。
let userDefaults = UserDefaults.standard
self.selectedIndexes = userDefaults.value(forKey: "SelectedIndexes")
答案 1 :(得分:-1)
单元格accessoryType
消失,因为UITableView
使用了可重用性功能,以便保持选择符合以下代码:
override func viewDidLoad()
{
super.viewDidLoad()
tableView.allowsMultipleSelection = true
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "celltwo")
cell.textLabel?.text = list[indexPath.row]
if let paths = tableView.indexPathsForSelectedRows
{
if (paths.contains(indexPath))
{
cell.accessoryType = .checkmark
}
else
{
cell.accessoryType = .none
}
}
else
{
cell.accessoryType = .none
}
cell.selectionStyle = .none
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCellAccessoryType.checkmark
{
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none
}
else
{
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark
}
//remove deselection
//tableView.deselectRow(at: indexPath, animated: true)
}
考虑到保存选择,我想这个信息应该与CoreData或UserDefaults中的数据源保持一致。