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
}