Как использовать свойство tableView в классе UITableViewCell - PullRequest
0 голосов
/ 24 июня 2018

В моем быстром проекте у меня есть tableViewController с классом TableViewController и одна ячейка прототипа с классом TableViewCell.Теперь я хочу использовать: tableView.reloadData () или другую функцию в классе TableViewCell.Я поместил кнопку в ячейку прототипа, здесь код:

class TableViewCell: UITableViewCell {

   let tableViewController = TableViewController()

    @IBAction func actionButton(_ sender: UIButton) {

    tableViewController.tableView.reloadData() // or other function 

}
}

этим методом: неожиданно найден ноль при развертывании необязательного значения.Я проверил, что класс TableViewController загружен раньше, чем класс TableViewCell, поэтому я не нашел проблему.Можете ли вы помочь мне найти причину этой ошибки?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Ваш метод actionButton создает новый экземпляр TableViewController каждый раз, когда он вызывается. Это не относится к TableViewController, который (предположительно) представляет клетки.

Вы можете справиться с этим несколькими способами. Протокол delegate - это «классический» способ сделать это, или вы можете использовать закрытие Swift.

Метод делегата

В твоей камере

protocol TableViewCellDelegate: class {
    func tableViewCellDidTapButton(_ tableViewCell: TableViewCell)
}

class TableViewCell: UITableViewCell {

    var weak delegate: TableViewCellDelegate?

    @IBAction func actionButton(_ sender: UIButton) {
        delegate?.tableViewCellDidTapButton(self)
    }
}

На ваш взгляд контроллер

class TableViewController: UITableViewController {

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {    
        let cell = dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
        cell.delegate = self
        return cell
    }
}

extension class TableViewController: TableViewCellDelegate {
    func tableViewCellDidTapButton(_ tableViewCell: TableViewCell) {
        let indexPath = indexPath(for: tableViewCell)
        // do something
    }
}

Метод закрытия

В твоей камере

class TableViewCell: UITableViewCell {

    var didTapButton: Void -> () = { }

    @IBAction func actionButton(_ sender: UIButton) {
        didTapButton()
    }
}

На ваш взгляд контроллер

class TableViewController: UITableViewController {

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {    
        let cell = dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
        cell.didTapButton = { 
            // do something with this indexPath
        }
        return cell
    }
}
0 голосов
/ 24 июня 2018

вы не можете вызвать TableViewController из другого класса

вам нужно использовать NotificationCenter или протокол

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