Установка делегата для ячеек UITableView - PullRequest
0 голосов
/ 07 октября 2019

У меня есть это для моего представления таблицы

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? CurrentItemsCell {
        cell.isUserInteractionEnabled = true
        let responseItems = currentItemsArray[indexPath.row]
        cell.configureCell(currentItem: responseItems)

        cell.setNeedsLayout()
        return cell
    } else {
        return CurrentItemsCell()
    }

}

Вот мой материал ячейки.

class CurrentItemsCell: UITableViewCell {
    ...
    weak var mDelegate:MyProtocolImage?
    ...
}

@IBAction func showImages(_ sender: Any) {
    guard let indexPath = indexPath else { return }
    mDelegate?.sendIndexPathBack(row: indexPath.row)
    print("FROM THE CELL CLASS")
}

protocol MyProtocolImage: class {
    func sendIndexPathBack(row: Int)
}

Внутри UITableView я пытался добавить cell.mDelagate = self, но естьошибка.

Cannot assign value of type 'ItemResultsViewController' to type 'MyProtocolImage?'

Что теперь, если я сделаю cell.mDelegate = self as! MyProtocolImage, синтаксис в порядке, но приложение вылетает.

По сути, у меня есть кнопка внутри каждой ячейки, мне нужно получить indexRow ячейки, чтобы я мог получить itemId любой кнопки элемента, которая была нажата. Затем я должен отправить itemId новому ViewController (модальному) с Seque.

Любая помощь будет потрясающей

1 Ответ

2 голосов
/ 07 октября 2019

Не добавляйте as! MyProtocolImage. Вместо этого объявите, что ваш класс соответствует протоколу.

class ItemResultsViewController: UITableViewController, MyProtocolImage {

Затем добавьте реализацию метода делегата в ваш ItemResultsViewController класс:

func sendIndexPathBack(row: Int) {
    // do something useful
}

Теперь вы можете сделать:

cell.mDelagate = self

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

Обновите ячейку и протокол:

@IBAction func showImages(_ sender: Any) {
    mDelegate?.sendIndexPathBack(cell: self)
    print("FROM THE CELL CLASS")
}

protocol MyProtocolImage: class {
    func sendIndexPathBack(cell: CurrentItemsCell)
}

Затем при реализации метода делегата:

func sendIndexPathBack(cell: CurrentItemsCell) {
    if let indexPath = tableView.indexPath(for: cell) {
        // do something useful
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...