嵌套在uitableviewcell

时间:2016-08-10 21:41:11

标签: ios swift uitableview uicollectionviewcell

我有一个UICollection,显示锁定给未登录用户的单元格上的挂锁。用户可以查看集合,然后以模态登录。当模态解散时,我试图重新加载表格的单元格和嵌套集合以从单元格中移除挂锁。

可见细胞不会刷新以移除挂锁。滚动集合时,屏幕外的单元格正确并显示挂锁。我在tableview和每个嵌套的collectionview上调用reloaddata()。

我的代码分为:

的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
  }

}

2 个答案:

答案 0 :(得分:4)

您应该移动调用以将单元格配置为willDisplayCell:方法。您可以从cellForItemAtIndexPath方法中删除它。这是配置要显示的单元格的任何可视方面的正确时间。

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

    let row = indexPath.row

    let workout = workouts[row]

    cell.configCell(workout)

    return cell

}

答案 1 :(得分:0)

问题在于: tableViewCell拥有用于配置collectionViewCell的数据。

如果您希望在不需要tableView.reloadData的情况下更新collectionViewCell,则必须从tableViewCell以外的地方获取用于配置collectionViewCell的数据(在您的情况下' exercise')。