Digital PCT265 defect CXTDT-579050: Carousel cell registration check.

This commit is contained in:
Hedden, Kyle Matthew 2024-07-03 18:40:43 -04:00
parent 90f9a0bcf5
commit b2ad684f00

View File

@ -43,6 +43,9 @@ open class Carousel: View {
/// The models for the molecules.
public var molecules: [MoleculeModelProtocol & CarouselItemModelProtocol]?
/// A list of currently registered cells.
public var registeredMoleculeIds: [String]?
/// The horizontal alignment of the cell in the collection view. Only noticeable if the itemWidthPercent is less than 100%.
public var itemAlignment = UICollectionView.ScrollPosition.left
@ -174,9 +177,7 @@ open class Carousel: View {
MVMCoreLoggingHandler.shared()?.handleDebugMessage("[\(Self.self)] [\(ObjectIdentifier(self).hashValue)]\noriginal model: \(originalModel?.debugDescription ?? "none")\nnew model: \(model)")
if #available(iOS 15.0, *) {
if let originalModel, carouselModel.isDeeplyVisuallyEquivalent(to: originalModel),
originalModel.visibleMolecules.isVisuallyEquivalent(to: molecules ?? []) // Since the carousel model's children are in place replaced and we do not have a deep copy of this model tree, add in this hack to check if the prior captured carousel items match the newly visible ones.
{
if hasSameCellRegistration(with: carouselModel, delegateObject: delegateObject) {
// Prevents a carousel reset while still updating the cell backing data through reconfigureItems.
MVMCoreLoggingHandler.shared()?.handleDebugMessage("[\(Self.self)] Model is visually equivalent. Skipping rebuild...")
prepareMolecules(with: carouselModel)
@ -284,23 +285,27 @@ open class Carousel: View {
/// Registers the cells with the collection view
func registerCells(with carouselModel: CarouselModel, delegateObject: MVMCoreUIDelegateObject?) {
var registeredIds = [String]()
for molecule in carouselModel.molecules {
if let info = getMoleculeInfo(with: molecule, delegateObject: delegateObject) {
collectionView.register(info.class, forCellWithReuseIdentifier: info.identifier)
registeredIds.append(info.identifier)
} else {
registeredIds.append(molecule.moleculeName)
}
}
let moleculeInfo = carouselModel.molecules.map {
getMoleculeInfo(with: $0, delegateObject: delegateObject)
}
// For each molecule with info, register it.
moleculeInfo.compactMap({ $0 }).forEach { collectionView.register($0.class, forCellWithReuseIdentifier: $0.identifier) }
for molecule in carouselModel.molecules {
registeredMoleculeIds = registeredIds
}
func hasSameCellRegistration(with carouselModel: CarouselModel, delegateObject: MVMCoreUIDelegateObject?) -> Bool {
let incomingIds = carouselModel.molecules.map { molecule in
if let info = getMoleculeInfo(with: molecule, delegateObject: delegateObject) {
collectionView.register(info.class, forCellWithReuseIdentifier: info.identifier)
return info.identifier
} else {
return molecule.moleculeName
}
}
return incomingIds == registeredMoleculeIds
}
//--------------------------------------------------