【问题标题】:Custom Cell in TableView hide label on DidSelectTableView中的自定义单元格隐藏DidSelect上的标签
【发布时间】:2020-03-04 11:23:19
【问题描述】:

我似乎无法弄清楚我做错了什么。

我有一个自定义单元格,它有自己的 UITableViewCell 和 nib(3 个标签)。

如果我选择要显示/隐藏已解决标签的单元格。我似乎无法将 ResolvedLabel 更改为隐藏或显示。该函数被调用,因为我可以看到打印语句。

didSelectRowAt中的代码

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

    let cell = tableView.cellForRow(at: indexPath) as! ResolvedIssueTableViewCell


    if cell.resolvedLabel.isHidden == true {

        tableView.deselectRow(at: indexPath, animated: true)
        print("THIS HAS BEEN SELECTED RESOLVED")

        cell.resolvedLabel.isHidden = false

        self.resolvedIssueType.append(self.issues[indexPath.row].partType)
        self.resolvedIssues.append(self.issues[indexPath.row].documentId)
        print(self.resolvedIssues)

    } else if cell.resolvedLabel.isHidden == false {

        tableView.deselectRow(at: indexPath, animated: true)
        print("THIS HAS BEEN SELECTED NOT RESOLVED")
        cell.resolvedLabel.isHidden = true

        if let index = self.resolvedIssues.firstIndex(of:self.issues[indexPath.row].documentId) {
            self.resolvedIssues.remove(at: index)
            self.resolvedIssueType.remove(at: index)
        }
        print(self.resolvedIssues)
        print(self.resolvedIssueType)

    }
}

【问题讨论】:

    标签: swift uikit tableview custom-cell


    【解决方案1】:

    你应该在didSelectRowAt函数的末尾调用tableView.reloadData()

    我已经重构了你的代码

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
        tableView.deselectRow(at: indexPath, animated: true)
    
        guard let cell = tableView.cellForRow(at: indexPath) as? ResolvedIssueTableViewCell else { return }
    
        if cell.resolvedLabel.isHidden {
    
            print("THIS HAS BEEN SELECTED RESOLVED")
            cell.resolvedLabel.isHidden = false
    
            self.resolvedIssueType.append(self.issues[indexPath.row].partType)
            self.resolvedIssues.append(self.issues[indexPath.row].documentId)
            print(self.resolvedIssues)
    
        } else {
    
            print("THIS HAS BEEN SELECTED NOT RESOLVED")
            cell.resolvedLabel.isHidden = true
    
            if let index = self.resolvedIssues.firstIndex(of:self.issues[indexPath.row].documentId) {
                self.resolvedIssues.remove(at: index)
                self.resolvedIssueType.remove(at: index)
            }
            print(self.resolvedIssues)
            print(self.resolvedIssueType)
    
        }
    
        tableView.reloadData() // Here is the magic :)
    }
    

    您可以通过Nicholas Swift's Medium Article了解更多信息

    【讨论】:

    • 重新加载tableView无法更新标签的隐藏属性
    【解决方案2】:

    老实说,为什么这不起作用并不重要,因为整个方法应该不同。

    不要直接尝试操作单元格,因为许多原因(主要是单元格可重用性)可能会出现问题(主要原因是单元格可重用性),而是更改模型(就像您已经做的那样)并刷新tableView - 或者更好的是只刷新受影响的单元格。

    所以你的代码会是这样的(请注意,我没有办法对此进行测试,所以这是我的想法,但一般的想法是有效的):

    1.在模型中进行更改

    2.在您的视图(单元格)中反映这种变化


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
        tableView.deselectRow(at: indexPath, animated: true)
    
        guard let cell = tableView.cellForRow(at: indexPath) as? ResolvedIssueTableViewCell else {
            print("Wrong type of cell. Bailing out...")
            return
        }
    
        let isResolved = ...// Probably by looking into something like `self.resolvedIssues.firstIndex(of:self.issues[indexPath.row].documentId)` judging from your code
    
        if isResolved {
            print("THIS HAS BEEN SELECTED RESOLVED")
            self.resolvedIssueType.append(self.issues[indexPath.row].partType)
            self.resolvedIssues.append(self.issues[indexPath.row].documentId)
            print(self.resolvedIssues)
        } else {
            print("THIS HAS BEEN SELECTED NOT RESOLVED")
            if let index = self.resolvedIssues.firstIndex(of:self.issues[indexPath.row].documentId) {
                self.resolvedIssues.remove(at: index)
                self.resolvedIssueType.remove(at: index)
            }
            print(self.resolvedIssues)
            print(self.resolvedIssueType)
    
        }
    
        tableView.reloadRows(at: [indexPath], with: .automatic)
    }
    

    然后让细胞的视觉状态反映你的模型:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = ...
        cell.resolvedLabel.isHidden = <whatever_makes_sense>
        ...
    }
    

    【讨论】:

      【解决方案3】:

      选择行之后。调用 tableview.reloaddata() 函数。

      func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      
          let cell = tableView.cellForRow(at: indexPath) as! ResolvedIssueTableViewCell
      
      
          if cell.resolvedLabel.isHidden == true {
      
              tableView.deselectRow(at: indexPath, animated: true)
              print("THIS HAS BEEN SELECTED RESOLVED")
      
              cell.resolvedLabel.isHidden = false
      
              self.resolvedIssueType.append(self.issues[indexPath.row].partType)
              self.resolvedIssues.append(self.issues[indexPath.row].documentId)
              print(self.resolvedIssues)
      
          } else if cell.resolvedLabel.isHidden == false {
      
              tableView.deselectRow(at: indexPath, animated: true)
              print("THIS HAS BEEN SELECTED NOT RESOLVED")
              cell.resolvedLabel.isHidden = true
      
              if let index = self.resolvedIssues.firstIndex(of:self.issues[indexPath.row].documentId) {
                  self.resolvedIssues.remove(at: index)
                  self.resolvedIssueType.remove(at: index)
              }
              print(self.resolvedIssues)
              print(self.resolvedIssueType)
      
          }
      
         tableView.reloadData()
      }
      

      【讨论】:

      • 重新加载无法显示/隐藏标签。它要么显示要么不显示,然后不会更新,
      【解决方案4】:

      与往常一样,在数据模型中保留有关一行的所有信息,而不是使用单独的数组。在didSelectRowAt 中修改模型并重新加载行。这是最可靠、最有效的方式。


      在数据模型中添加一个属性

      var isResolved = false
      

      cellForRow 中,根据isResolved 设置文本字段的hidden 属性。

      let issue = self.issues[indexPath.row]
      cell.resolvedLabel.isHidden = issue.isResolved
      

      didSelectRowAt替换为(是的,3行就足够了)

      func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
          tableView.deselectRow(at: indexPath, animated: true)
          self.issues[indexPath.row].isResolved.toggle()
          tableView.reloadRows(at: [indexPath], with: .none)
      }
      

      并删除两个额外的数组。


      要获取所有已解决的项目,只需 filter 数组

      let resolvedIssues = self.issues.filter{ $0.isResolved }
      

      【讨论】:

        猜你喜欢
        • 2020-02-29
        • 1970-01-01
        • 2019-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多