Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

reloading visible uicollectionviewcell when nested in uitableviewcell

I have a UICollection that shows a padlock on cells that locked to users who aren't logged in. The user can view the collection and then login in a modal. When the modal dismisses, I am trying to reload the cells of the table and the nested collection to remove the padlocks from the cells.

The visible cells are not refreshing to remove the padlock. When the collection is scrolled, the cells offscreen are correct and show with padlock. I am calling reloaddata() on both the tableview and each nested collectionview.

The code I have is separated to:

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
  }

}
like image 288
Edward Ford Avatar asked Aug 10 '16 21:08

Edward Ford


1 Answers

You should probably move the call to configure the cell to the willDisplayCell: method instead. You can remove it from the cellForItemAtIndexPath method. This is the correct time to configure any visual aspects of the cell to be displayed.

func collectionView(collectionView: UICollectionView,
    willDisplayCell cell: UICollectionViewCell,
    forItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let row = indexPath.row

    let workout = workouts[row]

    cell.configCell(workout)

    return cell

}
like image 70
picciano Avatar answered Oct 23 '22 11:10

picciano