如何根据选定的单元格在表格视图中设置启用的检查图像

Posted

技术标签:

【中文标题】如何根据选定的单元格在表格视图中设置启用的检查图像【英文标题】:How to set enabled checkimage in tableview based on the selected cells 【发布时间】:2018-01-11 16:45:42 【问题描述】:

我正在从服务器获取先前选择的类别列表。比如说我从服务器获取的 example.cateogrylist 是以下格式

categoryid : 2,6,12,17

现在我需要做的是要基于此类别列表在我的表格视图中启用复选标记,为此我将此列表转换为 [Int] 数组,如下所示:

func get_numbers(stringtext:String) -> [Int] 
    let StringRecordedArr = stringtext.components(separatedBy: ",")
    return StringRecordedArr.map  Int($0)!

在 viewDidLoad() 中:

  selectedCells = self.get_numbers(stringtext: UpdateMedicalReportDetailsViewController.catId)
  print(myselection)

在打印时它给了我这样的结果:[12,17,6,8,10]

我想根据这个数组启用 checkimage。我在打印它时尝试了一些代码,它给了我正确的结果,就像我在发布时选择的任何类别一样,我能够获取它但未能放回这个选择在 tableview.Requirement 中:当我打开这个页面时,它应该根据我从服务器获取的类别列表显示选择。

var selectedCells : [Int] = []

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

    let cell1  = table.dequeueReusableCell(withIdentifier: "mycell") as! catcell

    cell1.mytext.text = categoriesName[indexPath.row] 
      if UpdateMedicalReportDetailsViewController.flag == 1
    
          selectedCells = self.get_numbers(stringtext: UpdateMedicalReportDetailsViewController.catId)
        cell1.checkimage.image = another

        print(selectedCells)
    
    else
    

        selectedCells = []
        cell1.checkimage.image = myimage

    
    return cell1


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

    let cell = table.cellForRow(at: indexPath) as! catcell
    cell.checkimage.image = myimage
    if cell.isSelected == true
    
        self.selectedCells.append(indexPath.row)
        cell.checkimage.image = another
    

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) 
    let cell = table.cellForRow(at: indexPath) as! catcell
    if cell.isSelected == false
    

        self.selectedCells.remove(at: self.selectedCells.index(of: indexPath.row)!)

        cell.checkimage.image = myimage

    

输出:

【问题讨论】:

【参考方案1】:

这是大多数应用程序中非常常见的用例。我假设你有一个所有类别的数组,然后是一个选定类别的数组。您需要做的是在cellForRowAtIndexPath 中,检查“所有类别”数组中当前索引路径行对应的类别是否也存在于“选定类别”数组中。您可以通过比较 id 等来做到这一点。

如果您有匹配项,那么您就知道需要选择/检查单元格。一个干净的方法是给你的单元子类一个自定义的加载方法,你可以传递一个标志来选择/检查。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

let cell = table.dequeueReusableCell(withIdentifier: "mycell") as! catcell

let category = self.categories[indexPath.row] // Let's say category is a string "hello"
Bool selected = self.selectedCategories.contains(category)

cell.load(category, selected)

return cell


因此,对于上面的代码,假设categories 只是一个类别字符串数组,如helloworld***。我们检查selectedCategories 数组是否包含当前单元格/行的类别词。

假设我们正在设置的单元格有一个类别hello,而selectedCategories 确实包含它。这意味着 selected 布尔值被设置为 true。

然后我们将categoryselected 值传递给单元格子类的加载方法,在该加载方法中,您可以将单元格的标题文本设置为category,您可以检查selected 是否为真或 false,如果为 true,您可以显示复选框 UI。

【讨论】:

你能用代码解释一下吗,因为我不知道如何实现它。我真的是这个场景的新手。 另外还要补充一点,这是一个基本概念,您将在几乎所有您可能想要构建的应用程序中使用。如果你去做一些基本的 UITableView 教程,那么不难找到一些触及这个确切概念的教程。祝你好运。 非常感谢。嘿,但是我看不到加载方法,不知道你为什么可以检查我的代码并告诉我如何在我的情况下做同样的事情。 @deltami 你看不到加载方法,因为它默认不存在。这是您必须在 UITableViewCell 子类中自己创建的自定义方法。 比如说这是我的 selectedCells 数组:[19,23,16] m 从服务器获取我必须在加载方法中编写哪些步骤?你能用我的数组编辑你的答案吗?您可以参考我的 cellforrow 方法已添加到我的代码中。如果可以,请编辑您的答案。

以上是关于如何根据选定的单元格在表格视图中设置启用的检查图像的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 选定的单元格在滚动时不会保持选中状态

新添加的表格视图单元格在反弹时隐藏

图像下载后调整表格单元格大小

保存、保留和检索数组中的选定单元格

如何修复表视图单元格在启动时不显示?

如何选定excel表格中的一部分表格