如何保存在UITableView中滚动时消失的复选标记?

时间:2017-10-22 19:26:54

标签: ios swift uitableview

我对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)
}

2 个答案:

答案 0 :(得分:0)

滚动时复选标记正在消失,因为表视图会重复使用单元格,因此每当您滚动时都会调用'cellForRowAt'方法,并且您没有提供显示/隐藏此方法中的复选标记的逻辑。要解决此问题,您可以执行以下操作,

  1. 初始化数组以存储所选单元格的索引。

    var selectedIndexes : [Int] = []
    
  2. 使用在'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)
    
    }
    
    } 
    
  3. 使用显示/隐藏复选标记的逻辑更新'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
    }
    
  4. 为了保存下次启动应用程序时的选择,您可以将“selectedIndexes”数组保存到UserDefaults。为了实现这一目标,请执行以下操作:

    1. 更新'didSelectRowAt'方法以包含将所选索引保存到UserDefaults的逻辑。在方法结尾处的以下代码中。

       let userDefaults = UserDefaults.standard
       userDefaults.set(selectedIndexes, forKey: "SelectedIndexes")
      
    2. 将以下代码添加到'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中的数据源保持一致。