Как отобразить заголовки строк и разделов в collectionView на основе данных Firestore? - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь классифицировать элементы в разделах в табличном представлении на основе дат в качестве заголовков разделов. Я создал два массива, чтобы потом их можно было объединить для таких разделов и строк, как:

var tableViewModel = [TableViewModel]()
var items = [TableViewModel]()

var sectionTableViewModel = [Timestamp]()
var sectionItems = [Timestamp]()

Вот как я могу загрузить данные из Firestore:

ref.addSnapshotListener { documentSnapshot, error in
      guard let data = documentSnapshot else {
          print("Error fetching document: \(error!)")
          return
      }

      let documents = data.documents
      for document in documents {
          let item = TableViewModel(json: document.data())
          let sectionItem: Timestamp = document.data()["date"] as! Timestamp

           self.items.append(item)
          if (!self.sectionItems.contains(sectionItem)) {
              self.sectionItems.append(sectionItem)
          }
      }

      // Display as descending order.
      self.tableViewModel = self.items as [TableViewModel]
      self.sectionTableViewModel = self.sectionItems as [Timestamp]

      self.collectionView.reloadData()
  }

Теперь я не могу понять, как разделить мои элементы по разделам для tableView. То, что я сделал до сих пор, это заполнение раздела и строк, таких как:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.tableViewModel.count
}

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return self.sectionTableViewModel.count
}

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "sectionHeader", for: indexPath) as! SectionHeaderCollectionReusableView

    header.headerLabel.text = sectionTableViewModel[indexPath.section]
        return header
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! UpdatesCollectionViewCell

    cell.titleLabel.text =  self.tableViewModel[indexPath.row].title
}

Что он делает, так это то, что он правильно отображает заголовки разделов, но каждый раздел отображает все данные снова и снова, и я не могу понять, как фильтровать данные по дате. Создать другой массив и объединить вместе tableViewModel и sectionTableViewModel? Или мне отфильтровать элементы в cellForItemAt? Или изменить структуру данных Firestore?

1 Ответ

0 голосов
/ 11 сентября 2018

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

Сейчас у вас есть все разделы, использующие один и тот же массив, поэтому ваши элементы дублируются.

Теперь, чтобы решить эту проблему, вы можете сделать несколько вещей либо на входе, либо на бэкэнде из firestore.

Вы можете создать структуру данных в Firestore, где документ содержит дату и массив данных.

Еще одна вещь, которую вы можете сделать, - это использовать новый массив для каждой даты. Чтобы узнать, какому массиву принадлежит какая дата, Dictionary сделает эту работу.

Теперь, что касается того, чтобы я предоставлял код или предоставлял вам решение напрямую, я не собираюсь этого делать, потому что это не тот способ, которым кто-то учится. Если у вас есть еще вопросы для выяснения проблемы, я с удовольствием отвечу!

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