TableView中的自定义单元格在DidSelect上隐藏标签

时间:2020-03-04 11:23:19

标签: swift uikit tableview custom-cell

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

我有一个自定义单元格,它具有自己的UITableViewCell和笔尖(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)

    }
}

4 个答案:

答案 0 :(得分:0)

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

我已经对您的代码进行了一些重构

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

了解更多信息

答案 1 :(得分:0)

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

不是直接尝试操作单元,而是由于某种原因(主要是单元可重用性),改变模型(如您已经做过)并刷新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>
    ...
}

答案 2 :(得分:0)

选择行之后。调用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()
}

答案 3 :(得分:0)

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


在数据模型中添加属性

var isResolved = false

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

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

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

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 }
相关问题