У меня есть стандартная ячейка сообщения чата, которая изменяет ограничения в зависимости от того, отправляет ли пользователь сообщение или нет.
Ячейка:
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, для справки:
Решение:
Выходы ограничения странные . Я не мог заставить их не быть нулевыми или вообще не работать. Поэтому я переключил методы.
Вместо этого я помещаю свое сообщение в стек, а их - в свой 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])
}