简体   繁体   中英

Sending cell info from one view controller to another Swift and Parse

I have a tableView displaying all the users on ViewController1(VC1) when the currentUser chooses a cell it segues to ViewController2(VC2) and needs to display all the user information from the cell that was clicked onto labels and a PFImageView. I have all the user info for the last cell displaying. So even though I clicked a different cell the next VC is only displaying the user at the end of the list. So lets say my user cell list display starts with Aisling, roger, dave and john. I click on cell 'Aisling' and segue to VC2, it displays all of Johns profile info.

VC1: under the class:

var appUsers = [PFUser]()
var userToShow = PFUser()

then:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let singleCell: CustomCell = tableView.dequeueReusableCellWithIdentifier("mySingleCellid") as! CustomCell

    let userObject = appUsers[indexPath.row] as PFObject

    singleCell.userName.text = userObject["name"] as? String
    singleCell.userAge.text = userObject["age"] as? String
    singleCell.usersProfileImage.file = userObject["image"] as? PFFile
    singleCell.usersProfileImage.loadInBackground()
    // when userToShow is here it shows the user detail of the last cell everytime
userToShow = appUsers[indexPath.row]

    return singleCell

} // cell for row

// when userToShow is here it crashes the app when the cell is clicked giving the error:unexpectedly found nil while unwrapping an Optional value
      func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
       userToShow = appUsers[indexPath.row]

      func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "userProfileDetailsSegue" {
            if let destinationVC = segue.destinationViewController as? UserProfileDetailsViewController {
                destinationVC.userToShowDetail = userToShow
            }
        }
    }
}

On VC2: below the class:

  var userToShowDetail = PFUser()

Then:

 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    userName.text = userToShowDetail["name"] as? String
    userBio.text = userToShowDetail["bio"] as? String
    userAge.text = userToShowDetail["age"] as? String
    userProfile.file = userToShowDetail["image"] as? PFFile
    userProfile.loadInBackground()
}

It only displays in VC2 the user details belonging to the user in the last cell on VC1. Instead of the user details belonging to the user in the cell that was chosen.

Stuck on this for a few weeks now and my deadline is pushing on can't solve it any help would really be appreciated!!! All links and help I could find online is for C# and obj c.

赛格布局

VC1

//PUT THIS IN THE FIRST VC CLASS
var appUserResult: PFUser?

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    //TAKE OUT LET - YOU'VE ALREADY DEFINED AS CLASS VAR
    appUserResult = appUsers[indexPath.row]

    print(appUserResult)
    self.performSegueWithIdentifier("openVC2", sender: self)
}

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
   if segue.identifier == "openVC2" {
    let indexPath = self.resultsPageTableView.indexPathForSelectedRow!

//INDEXPATH ISN'T AVAILABLE IN PREPAREFORSEGUE
//let userToShow = appUsers[indexPath.row]

let newVc = segue.destinationViewController as! UserProfileDetailsViewController
  //USE THE CLASS VARIABLE TO PASS
  newVc.userToShowDetail = appUserResult

VC2

var userToShowDetail: PFUser?

In storyboard, delete the old segue. Create a new one from VC1 to VC2 (not from the table cells). Give it the identifier "openVC2".

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM