ios swift uitableview uicollectionviewcell

ios - recargando uicollectionviewcell visible cuando está anidado en uitableviewcell



swift (2)

El problema radica en el hecho de que: el tableViewCell posee los datos que se utilizan para configurar el collectionViewCell.

Si desea que su collectionViewCell se actualice sin la necesidad de tableView.reloadData, los datos que se utilizan para configurar la collectionViewCell (en su caso, ''entrenamiento'') deben ser recuperados desde otro lugar que no sea desde la tableViewCell.

Tengo una colección UIC que muestra un candado en las celdas que está bloqueado para los usuarios que no han iniciado sesión. El usuario puede ver la colección y luego iniciar sesión en un modo. Cuando el modal se retira, estoy intentando recargar las celdas de la tabla y la colección anidada para eliminar los candados de las celdas.

Las celdas visibles no son refrescantes para quitar el candado. Cuando la colección se desplaza, las celdas fuera de la pantalla son correctas y se muestran con un candado. Estoy llamando a reloaddata () tanto en la vista de tabla como en cada vista de colección anidada.

El código que tengo está separado para:

UIViewController

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("SectionWorkouts", forIndexPath: indexPath) as! SectionTableViewCell cell.delegate = self // Return the workouts count from the section let intIndex = indexPath.row let index = workoutSections.startIndex.advancedBy(intIndex) let currentWorkoutSectionKey = workoutSections.keys[index] if let currentWorkoutSection = workoutSections[currentWorkoutSectionKey] { cell.workoutsCollection.dataSource = sectionWorkoutsCell cell.workoutsCollection.delegate = sectionWorkoutsCell cell.updateCellWithWorkouts(currentWorkoutSectionKey, workouts: currentWorkoutSection) } } return cell }

UITableViewCell

class SectionTableViewCell: UITableViewCell,UICollectionViewDelegate, UICollectionViewDataSource { var workouts = [Workout]() var delegate: WorkoutCellDelegate? @IBOutlet weak var sectionTitle: UILabel! @IBOutlet weak var workoutsCollection: UICollectionView! func updateCellWithWorkouts(title: String, workouts: [Workout]){ self.sectionTitle.text = title self.workouts = workouts dispatch_async(dispatch_get_main_queue(),{ self.workoutsCollection.reloadData() }) } func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("SectionWorkoutCell", forIndexPath: indexPath) as! SectionCollectionViewCell let row = indexPath.row let workout = workouts[row] cell.configCell(workout) return cell } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return workouts.count } func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { let row = indexPath.row let feature = workouts[row] if let delegate = self.delegate{ delegate.didSelectWorkoutCell(feature) } } }

UICollectionViewCell

class SectionCollectionViewCell: UICollectionViewCell { @IBOutlet weak var imageContainer: UIView! @IBOutlet weak var image: UIImageView! @IBOutlet weak var tintOverlay: UIView! @IBOutlet weak var padlock: UIImageView! @IBOutlet weak var workoutTitle: UILabel! @IBOutlet weak var duration: UILabel! var locked = true required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } func configCell(workout: Workout){ self.workoutTitle.text = workout.name if workout.type == "Free" || AccountManager.userIsLoggedInMember() { self.setToUnLocked() }else{ self.setToLocked() } self.layoutIfNeeded() } func setToUnLocked(){ locked = false tintOverlay.alpha = 0 padlock.alpha = 0 } func setToLocked(){ locked = true tintOverlay.alpha = 0.6 padlock.alpha = 1 } }


Probablemente debería mover la llamada para configurar la celda al método willDisplayCell: lugar. Puede eliminarlo del método cellForItemAtIndexPath . Este es el momento correcto para configurar cualquier aspecto visual de la celda que se mostrará.

func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let row = indexPath.row let workout = workouts[row] cell.configCell(workout) return cell }