Как избежать дублирования подпредставлений в iOS / Swift tableView - PullRequest
0 голосов
/ 07 января 2020

У меня есть tableView, который отображает сообщения чата. Я хочу вставить разделитель даты перед каждым сообщением, которое является первым сообщением о новой дате (дне). Итак, я создаю label и добавляю его в представление сообщения чата и корректирую ограничения. Но мой метод перерисовывает вставляемое представление label:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCell(withIdentifier: "Chat Message", for: indexPath) as! ChatViewCellView

   cell.myChatView.Text = self.messageData[self.messageIndex!].messages[indexPath.item]

   let dateLabel:UILabel = createDateSep(date: self.messageData[self.messageIndex!].message_dates[indexPath.item])

   cell.myChatView.addSubview(dateLabel)

   let labelConstraint = NSLayoutConstraint(item: cell.myChatViewReceived.nameView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: dateLabel, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 18)

   labelConstraint.identifier = "dateSeparatorIdentifier"
   NSLayoutConstraint.activate([labelConstraint])
}

(createDateSep - это просто моя функция для форматирования строки даты.)

Служба, которая передает tableView предоставляет два массива, один с текстом messages и один с датами (message_dates).

Концептуально я понимаю, почему представление воссоздается во время прокрутки, но оно берет разные значения даты из массива, который содержит даты, и рисует их в одном месте. Я не знаю, почему это происходит, и я не знаю, как предотвратить перерисовку, даже если строки даты были одинаковыми, правильные значения. Любое решение должно быть совместимо с iOS 9. У меня есть отдельные Xib

Вот как это выглядит (обратите внимание, что 22 ноября и дата De c 26, а De c 26 - это правильно):

enter image description here

1 Ответ

1 голос
/ 08 января 2020

Ответ на ваш вопрос: Ячейки используются повторно, что означает, что вы добавляете еще "Метка разделителя даты" каждый раз.

Я предлагаю :

  • добавьте «Метку разделителя даты» в обе ваши «Полученные» и «Отправленные» XIB.
  • Добавьте два ограничения в верхней части метки «Имя / Время» - одно в нижнюю часть «Метка разделителя даты», а другое - в верхнюю часть представления содержимого.
  • Подключение их через IBOutlet в ваших клеточных классах. Назовите одно dateVisibleConstraint, а другое dateHiddenConstraint
  • Установите для приоритета dateVisibleConstraint значение High (750) и установите для приоритета dateHiddenConstraint значение Low (250)
  • At во время выполнения настройте значения Приоритета в зависимости от того, скрыта или отображается метка даты.

Я разместил полный пример здесь: https://github.com/DonMag/ChatLayout

Выход:

enter image description here

и, после некоторой прокрутки:

enter image description here

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