Search code examples
iosxcodeswift3uicollectionviewcloudkit

UICollectionView Controller and Passing CloudKit data in Prepare for Segue


I have successfully populated a UICollectionView controller with data and images from a CloudKit record, however I am having a problem passing the selected cell to the details UIViewController. Here is my code thus far -

override func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}


override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.staffArray.count

}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> StaffCVCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! StaffCVCell

    let staff: CKRecord = staffArray[indexPath.row]

    let iconImage = staff.object(forKey: "staffIconImage") as? CKAsset
    let iconData : NSData? = NSData(contentsOf:(iconImage?.fileURL)!)


    let leaderNameCell = staff.value(forKey: "staffName") as? String
    cell.leaderNameLabel?.text = leaderNameCell

    cell.leaderImageView?.image = UIImage(data:iconData! as Data);
    return cell 
}


func prepare(for segue: UIStoryboardSegue, sender: StaffCVCell) {
    if segue.identifier == "showStaffDetail" {
        let destinationController = segue.destination as! StaffDetailsVC
        if let indexPath = collectionView?.indexPath {
            let staffLeader: CKRecord = staffArray[indexPath.row]
            let staffID = staffLeader.recordID.recordName
            destinationController.staffID = staffID
        }
    }
}

The problem occurs at the line -

let staffLeader: CKRecord = staffArray[indexPath.row]

where I am presented with the error -

Value of type '(UICollectionViewCell) -> IndexPath?' has no member 'row'

I have tried replacing row with cell, however this only presents another error -

Value of type '(UICollectionViewCell) -> IndexPath?' has no member 'cell'

I am sure there is something fundamental i'm missing but cannot see it. Any pointers greatly appreciated.


Solution

  • If your segue is triggered by touching a cell, you want something along the lines of code below:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    
        if segue.identifier == "showStaffDetail" {
    
            let destinationController = segue.destination as! StaffDetailsVC
    
            // Find the correct indexPath for the cell that triggered the segue
            // And check that the sender is, in fact, a StaffCVCell
            if let indexPath = collectionView?.indexPath(for: sender), let sender = sender as? StaffCVCell {
    
                // Get your CKRecord information
                let staffLeader: CKRecord = staffArray[indexPath.item]
                let staffID = staffLeader.recordID.recordName
    
                // Set any properties needed on your destination view controller
                destinationController.staffID = staffID
            }
        }
    }
    

    Note that I've changed the method signature back to the standard method signature.