Представления содержимого не отображаются на UITableViewCell - PullRequest
0 голосов
/ 22 мая 2018

Это часть моей раскадровки:

image

это мое работающее приложение:

image

Это моечасть кодов:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 0 {
            if indexPath.row == 0 {
                 return super.tableView(tableView, cellForRowAt: indexPath)
            } else {
                tableView.register(SubTextFieldCell.self, forCellReuseIdentifier: "SubTextFieldCell")
                let cell = tableView.dequeueReusableCell(withIdentifier: "SubTextFieldCell", for: indexPath) as! SubTextFieldCell

//                cell.deleteButton.isEnabled = true
//                cell.subTextfield.text = "OK"

                print("indexPath.row: \(indexPath.row)")

                return cell
            }
...

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

Если я использую код, подобный этому cell.deleteButton..., Xcode сообщит об ошибке:

Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертыванииНеобязательное значение

Затем я попытался использовать метод viewWithTag, чтобы увидеть, отображается ли содержимое, но я по-прежнему получаю ту же ошибку, что и раньше.

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

1 Ответ

0 голосов
/ 22 мая 2018

Когда вы настраиваете пользовательские ячейки внутри файла раскадровки, вам не нужно вызывать register(_:forCellReuseIdentifier:), потому что раскадровка должна была сделать это за вас.

Причина, по которой deleteButton равна нулю, заключается в том, что по- регистрируя класс ячейки, как вы сделали, вы перезаписали то, что раскадровка зарегистрировала для вас.Все ячейки, созданные путем удаления из очереди с этим идентификатором повторного использования, не будут иметь никакого отношения к раскадровке и будут просто пустыми.

При условии, что все @IBOutlet s и идентификаторы повторного использования и все настроено (что вы сказали, что сделали),затем просто удалите ячейку из очереди с идентификатором повторного использования, установленным в раскадровке.

Пример ячейки удаления:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        if indexPath.row == 0 {
            return super.tableView(tableView, cellForRowAt: indexPath)
        } else {
            // Registering again is unnecessary, because the storyboard should have already done that.
//            tableView.register(SubTextFieldCell.self, forCellReuseIdentifier: "SubTextFieldCell")
            let cell = tableView.dequeueReusableCell(withIdentifier: "SubTextFieldCell") as! SubTextFieldCell

            cell.deleteButton.isEnabled = true
            cell.subTextfield.text = "OK"

            return cell
        }
    } else {
        ...
    }
}

Примечание:

Даже в случаяхгде вам нужно зарегистрировать класс в табличном представлении, вам нужно будет сделать это только один раз.(Например, во время viewDidLoad)

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

Подключение представлений к ячейкам в раскадровке

Установка подкласса для представления таблицы Subclass set to Table View in Storyboard

Установить подкласс для первой ячейки прототипа Subclass set to prototype cell

Установить идентификатор повторного использования для ячейки прототипа enter image description here

Убедитесь, что подпредставление (UIButton и т. Д.) Связано со свойством с @IBOutlet (код подкласса показан ниже) IB Outlet set to button, as seen by cell IB Outlet set to button, as seen by button

Пример UITableViewController подкласс:

class MyTableViewController: UITableViewController {

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.row == 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "MyFirstCell", for: indexPath) as! MyFirstTableViewCell

            // Configure cell if needed
            cell.myButton.setTitle("New Button Text", for: .normal)
            cell.myButton.tintColor = .green

            return cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "MySecondCell", for: indexPath) as! MySecondTableViewCell

            // Configure cell if needed
            cell.myTextField.backgroundColor = .red

            return cell
        }
    }

}

Пример UITableViewCell подкласс:

class MyFirstTableViewCell: UITableViewCell {

    @IBOutlet weak var myButton: UIButton!

}

Результат:

Simulator screenshot showing changes to cell subviews

...