Пользовательская ячейка в TableView скрыть метку на DidSelect - PullRequest
0 голосов
/ 04 марта 2020

Кажется, я не могу понять, что я делаю неправильно.

У меня есть пользовательская ячейка, которая имеет свои UITableViewCell и nib (3 метки).

Если Я выбираю ячейку, которую хочу показать / скрыть метку Resolved Label. Я не могу изменить ResolvedLabel на Hidden или Show. Функция вызывается так, как я вижу оператор Print.

Код в 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 голосов
/ 04 марта 2020

Как всегда, хранит всю информацию об одной строке в модели данных , а не использует отдельные массивы. В didSelectRowAt измените модель и перезагрузите строку. Это самый надежный и эффективный способ.


В модели данных добавьте свойство

var isResolved = false

в cellForRow и установите свойство hidden текстового поля в зависимости от isResolved.

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 }
0 голосов
/ 04 марта 2020

Честно говоря, не имеет значения, почему это не работает, потому что весь подход должен быть другим.

Вместо непосредственной попытки манипулирования ячейкой, что может быть проблематичным c для лота причин (основной из которых является повторное использование ячейки), измените модель (как вы уже do) и refre sh tableView - или, что еще лучше, refre sh только затронутой ячейки.

Таким образом, ваш код будет выглядеть примерно так (обратите внимание, что у меня нет возможности проверить это, поэтому от макушки головы, но идея родов верна):

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>
    ...
}
0 голосов
/ 04 марта 2020

После выбора строки. вызовите функцию 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()
}
0 голосов
/ 04 марта 2020

Вы должны вызвать 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 :)
}

Вы можете узнать больше из Средств Николаса Свифта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...