Не удалось привести значение типа «UITableViewWrapperView» к «UITableView» под iOS 11 - PullRequest
0 голосов
/ 25 октября 2018

У меня есть пользовательский UITableCell для UITableView, на котором есть кнопка.

Я использую следующий код для определения indexPath ячейки, используя этот код, и передаю индекс, чтобы я мог предпринять соответствующие действия на View Controller для ячейки.

Это прекрасно работает на iOS 11 и выше, но не работает под ней.Пожалуйста, помогите мне понять, почему это происходит и как я могу избежать этой ошибки.Я так застрял с этим.Помощь очень ценится.Спасибо.

class PostCellView: UITableViewCell {
    weak var delegate:  PostCellViewDelegate?

    // utilities
    @IBAction func cellAction(_ sender: UIButton) {
        let tableView : UITableView = self.superview as! UITableView
        let indexPath: IndexPath = tableView.indexPathForRow(at: self.center)!

        delegate?.cellTaskerAction(row : indexPath.row)
    }
}

Я не могу использовать закрытие обратного вызова в пользовательской ячейке, которая установлена ​​в cellForRow и вызывается в IBAction пользовательской ячейки (как предложено @vadian в Обнаружение проблемы)Кнопка cellForRowAt ).Я удаляю ячейки, и поскольку cellForRow не обновляется каждый раз, в некоторых ячейках сохраняется последний сохраненный индекс, что приводит к ошибкам.Пожалуйста, помогите мне найти решение этой проблемы.

1 Ответ

0 голосов
/ 25 октября 2018

Основная проблема заключается в том, что вы делаете неправильное предположение, что супервизор ячейки - это табличное представление.Никогда не делайте предположений о структуре частного подпредставления классов представлений, предоставленных кем-то, кроме вас.

Вторичная проблема заключается в том, что вы помещаете слишком много логики в класс ячейки.Делегат вашей ячейки должен просто передать себя (ячейку) в качестве единственного параметра в метод делегата.Пусть разработчик делегата получит всю необходимую ему информацию о ячейке.Если делегат хочет знать путь индекса ячейки, тогда делегат может запросить табличное представление.Эта логика не принадлежит ячейке.

Никогда не нужно, чтобы ячейка знала свой собственный путь индекса или в каком табличном представлении она находится. Ячейка должна заботиться только о своих собственных представлениях и ничего больше.

Обновите метод протокола, чтобы использовать ячейку в качестве параметра.

Обновите обработчик кнопок вашей ячейки, чтобы просто передать себя в качестве параметра методу делегата.

Обновите метод делегата вКонтроллер вида принимает ячейку в качестве аргумента и получает все, что ему нужно, основываясь на этой ячейке.

Это делает реализацию класса вашей ячейки намного проще и помещает логику, где он принадлежит, - в контроллер представления.

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