collectionView.reloadsection не перезагружает ячейку - PullRequest
1 голос
/ 03 марта 2020

Так что я использую композиционный макет для автоматического изменения размера ячейки. Вот как я создаю свой раздел макета. Затем я возвращаю его в UICollectionViewCompositionalLayout (sectionProvider:).

    }

private func whatsNewSection() -> NSCollectionLayoutSection {
    let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(80))
    let item = NSCollectionLayoutItem(layoutSize: itemSize)

    let group = NSCollectionLayoutGroup.vertical(layoutSize: itemSize, subitems: [item])

    let section = NSCollectionLayoutSection(group: group)
    section.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 24, bottom: 24, trailing: 24)
    section.boundarySupplementaryItems = [
        .init(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(50)), elementKind: UICollectionView.elementKindSectionHeader, alignment: .top)
    ]

    return section
}

Так что этот раздел выглядит примерно так:

enter image description here

Сейчас У меня есть 2 файла пера, каждый из которых имеет свой класс. Заголовок раздела имеет только метку и кнопку. Давайте проигнорируем заголовок, потому что проблема заключается в WhatsNewCell. Файл класса выглядит примерно так:

class WhatsNewCell: UICollectionViewCell {
  static let reuseIdentifier  = String(describing: WhatsNewCell.self)
  var delegate: WhatsNewCellDelegate?

  @IBOutlet weak var appVersionLabel: UILabel!
  @IBOutlet weak var appUpdateLabel: UILabel!
  @IBOutlet weak var moreButton: UIButton!


  override func awakeFromNib() {
    super.awakeFromNib()
    moreButton.addTarget(self, action: #selector(handleMore), for: .touchUpInside)
  }

  @objc private func handleMore() {
    self.moreButton.setTitle("", for: .normal)
    self.appUpdateLabel.numberOfLines = 0

    delegate?.moreButtonClick()
  }
}

Хорошо, поэтому метка версии и метка обновления находятся в виде стека. Когда пользователь нажимает кнопку, я меняю количество строк для метки обновления. Теперь я создал делегата под названием WhatsNewCellDelegate, чтобы иметь возможность перезагрузить представление моей коллекции из моего контроллера. Вот так я перезагружаю свою коллекцию в моем контроллере. Также я установил делегат ячейки на мой контроллер при инициализации ячейки.

extension AppDetailCollectionVC: WhatsNewCellDelegate {
func moreButtonClick() {
   //collectionView.collectionViewLayout.invalidateLayout()

    collectionView.performBatchUpdates({
        //collectionView.reloadData()
        collectionView.reloadSections(IndexSet(integer: 2))
    }, completion: nil)
}

}

Теперь это работает, когда я вызываю данные перезагрузки, но не работает, когда я вызываю перезагрузку. разделы. Мне нужно дважды нажать кнопку «больше», чтобы она работала с разделами перезагрузки. Также я попытался использовать invalidateLayout (), но это заставляет некоторые мои клетки исчезать. Посмотрите на снимки экрана ниже.

enter image description here

Вот как это выглядит, когда я нажимаю кнопку «more» с помощью invalidateLayout ().

enter image description here

Так что я не знаю, что происходит. Как бы я мог перезагрузить раздел, не нажимая кнопку больше дважды. Буду очень признателен за помощь.

Ответы [ 4 ]

0 голосов
/ 08 марта 2020

Полагаю, при первой загрузке раздела collectionView создает новую ячейку, а self.appUpdateLabel.numberOfLines принимает начальное значение 0. Вы можете добавить точку останова в awakeFromNib и нажать кнопку «Далее», чтобы проверить ее.

Попробуйте добавить метод @objc private func handleMore() - self.invalidateIntrinsicContentSize()

И, как упоминал Луис Рамирес, вы должны использовать некоторые внешние конфигурация для ячейки.

Или, если в этом представлении коллекции только одна ячейка с типом WhatsNewCell, вы можете сделать что-то вроде этого:

class WhatsNewCell: UICollectionViewCell {
    private static var shouldShowDetails = false


  override func awakeFromNib() {
    super.awakeFromNib()
    if Self.shouldShowDetails {
        self.moreButton.setTitle("", for: .normal)
        self.appUpdateLabel.numberOfLines = 0
    } else {
        self.moreButton.addTarget(self, action: #selector(handleMore), for: .touchUpInside)
    }
  }

    @objc private func handleMore() {
        Self.shouldShowDetails = true
        ....
    }
}
0 голосов
/ 06 марта 2020

Так что я получил его на работу. Я должен был добавить свойство к моей модели. Примерно так.

var shouldShowFullDetails: Bool = false

Затем я должен был сделать что-то вроде этого.

func moreButtonClick() {
    model?.shouldShowFullDetails = true

    self.collectionView.reloadItems(at: [IndexPath(item: 0, section: 1)])
}

Затем в своем файле я должен был сделать что-то вроде этого.

  class WhatsNewCell: UICollectionViewCell {
  static let reuseIdentifier  = String(describing: WhatsNewCell.self)
  var delegate: WhatsNewCellDelegate?

  @IBOutlet weak var appVersionLabel: UILabel!
  @IBOutlet weak var appUpdateLabel: UILabel!
  @IBOutlet weak var moreButton: UIButton!

  var model: Model? {
    didSet {
        configureCell()
    }
  }

  override func awakeFromNib() {
    super.awakeFromNib()

    moreButton.addTarget(self, action: #selector(handleMore), for: .touchUpInside)
  }

  @objc func handleMore() {
    delegate?.moreButtonClick()
  }

  private func configureCell() {
    guard let model = model else { return }

    if app.shouldShowFullReleaseNotes {
        appUpdateLabel.numberOfLines = 0
    } else {
        appUpdateLabel.numberOfLines = 3
      }
  }
}
0 голосов
/ 06 марта 2020

Что произойдет, если вы просто сделаете это?

extension AppDetailCollectionVC: WhatsNewCellDelegate {
    func moreButtonClick() {
         collectionView.collectionViewLayout.invalidateLayout()
    }
}
0 голосов
/ 06 марта 2020

Попробуйте запустить все это в основном потоке без performBatchUpdates?

DispatchQueue.main.async {
    collectionView.reloadSections(IndexSet(integer: 2))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...