Ограничение TableViewCell возвращает nil при создании новой ячейки - PullRequest
0 голосов
/ 19 июня 2020

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

Ячейка:

class ChatTableViewCell: UITableViewCell {


    @IBOutlet weak var containerView: UIView!
    @IBOutlet weak var nonUserLabel: UILabel!
    @IBOutlet weak var userLabel: UILabel!
    @IBOutlet weak var message: UILabel!
    @IBOutlet weak var messageLeading: NSLayoutConstraint!
    @IBOutlet weak var messageTrailing: NSLayoutConstraint!  
}

Загрузка данных и настройка ограничений в cellForRowAt.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: K.Chat.Cell, for: indexPath) as! ChatTableViewCell
        cell.selectionStyle = .none


        let currentMessage = model?.practice?.messages[indexPath.row]
        if (currentMessage?.sender == model?.user) {
            cell.nonUserLabel.isHidden = true
            cell.userLabel.isHidden = false
            cell.messageLeading.isActive = false
            cell.messageTrailing.isActive = true
            cell.userLabel.attributedText = NSAttributedString(string: "\((currentMessage?.sender?.name)!)", attributes:
            [.underlineStyle: NSUnderlineStyle.single.rawValue])
        } else {
            cell.nonUserLabel.isHidden = false
            cell.userLabel.isHidden = true
            cell.messageLeading.isActive = true
            cell.messageTrailing.isActive = false
            cell.nonUserLabel.attributedText = NSAttributedString(string: "\((currentMessage?.sender?.name)!)", attributes:
            [.underlineStyle: NSUnderlineStyle.single.rawValue])
        }
        cell.message.text = currentMessage?.content


        return cell
    }

Стандартные вещи. Все это работает.

Что странно, так это то, что когда я добавляю новые данные в свою базу данных области, а затем перезагружаю данные с помощью tableView.reloadData (), LABELS загружаются нормально, но CONSTRAINTS возвращают nil!

@IBAction func sendButtonPressed(_ sender: UIButton) {
        if textField.text! != "" {
            let message = Message(sender: (model?.user)!, content: textField.text!)

            do {
                try model?.realm!.write {
                    model?.practice!.messages.append(message)
                }
            } catch {
                print("realm.write had an error: \(error)")
            }
        }
        tableView.reloadData()

    }

Я получаю стандартную ошибку «обнаружено ноль при разворачивании необязательного значения» в строке «cell.messageLeading.isActive = false»

Изменить: это также происходит, когда я прокручиваю и ячейки удаляются из очереди для повторного использования - когда они пытаются появиться снова, я получаю ту же ошибку. Так что это не функция sendButtonPressed. Это что-то, что происходит в любое время, когда ячейка загружается ПОСЛЕ начальной загрузки.

Любая помощь?

Рассматриваемый xib, для справки: The xib in question, for reference:

Решение:

Выходы ограничения странные . Я не мог заставить их не быть нулевыми или вообще не работать. Поэтому я переключил методы.

Вместо этого я помещаю свое сообщение в стек, а их - в свой cellForRowAt. Я просто переключаю выравнивание с конца на ведущее, как это.

В любом случае это более элегантное решение.

if (currentMessage?.sender?.firebase_uid == model?.user?.firebase_uid) {
            cell.nonUserLabel.isHidden = true
            cell.userLabel.isHidden = false
            cell.messageStackView.alignment = .trailing
            cell.userLabel.attributedText = NSAttributedString(string: "\((currentMessage?.sender?.name)!)", attributes:
            [.underlineStyle: NSUnderlineStyle.single.rawValue])
        } else {
            cell.nonUserLabel.isHidden = false
            cell.userLabel.isHidden = true
            cell.messageStackView.alignment = .leading
            cell.nonUserLabel.attributedText = NSAttributedString(string: "\((currentMessage?.sender?.name)!)", attributes:
            [.underlineStyle: NSUnderlineStyle.single.rawValue])
        }
...