简体   繁体   中英

Parse and Swift. Set tableViewCell accessory type from Parse relation

So, I have got a tableView which shows courses. The user is able to set Checkmarks on these courses (cells) and save them in his PFUser object as a relation to the Courses class (where all courses are stored). My question is, how do I checkmark the courses a user has already saved at some point before.

This is my attempt, but I don't know how to continue. How do I get the cells with a specific Label? (Or is there a better way?)

    let courseRel = PFUser.currentUser()?.relationForKey("usercourses")
    let query = courseRel!.query()
    let qObjects :Array = query!.findObjects()!
    println(qObjects)
    for var qObjectsCount = qObjects.count; qObjectsCount > 0; --qObjectsCount {
        var qAnObject: AnyObject = qObjects[qObjectsCount - 1]
        var courseName = qAnObject["coursename"]
        println(courseName)
        if let cell: AnyObject? = tableView.dequeueReusableCellWithIdentifier("courseCell"){

        }

    }

EDIT: that code is in my override viewDidLoad

EDIT2:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell {

    var cell = tableView.dequeueReusableCellWithIdentifier("courseCell") as! PFTableViewCell!
    if cell == nil {
        cell = PFTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "courseCell")
    }

    let courseRel = PFUser.currentUser()?.relationForKey("usercourses")
    let query = courseRel!.query()
    let qObjects :Array = query!.findObjects()!


    // Extract values from the PFObject to display in the table cell
    if let courseName = object?["coursename"] as? String {
        cell?.textLabel?.text = courseName


        if contains(qObjects, object) {
            cell?.accessoryType = UITableViewCellAccessoryType.Checkmark
        }
    }

    return cell
}

Error in line ‚if contains(qObjects, object) {'

Generic parameter 'S.Generator.Element' cannot be bound to non-@objc protocol type 'AnyObject'

EDIT3:

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell {

    var cell = tableView.dequeueReusableCellWithIdentifier("courseCell") as! PFTableViewCell!
    if cell == nil {
        cell = PFTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "courseCell")
    }

    let courseRel = PFUser.currentUser()?.relationForKey("usercourses")
    let query = courseRel!.query()
    let qObjects :Array = query!.findObjects()!


    // Extract values from the PFObject to display in the table cell
    if let courseName = object?["coursename"] as? String {
        cell?.textLabel?.text = courseName
        cell.tintColor = UIColor.blackColor()
    }

    if contains(qObjects, { $0 === object }) {
        cell?.accessoryType = UITableViewCellAccessoryType.Checkmark
        self.selectedRows.addIndex(indexPath.row)
    }else{
        cell?.accessoryType = UITableViewCellAccessoryType.None
    }

    return cell
}

EDIT4: (Working code)

In the class:

// Initializing qObject variable 
var qObjects :Array<AnyObject> = []

In my objectsDidLoad:

    // Get PFObjects for the checkmarks on courses the currentUser has already selected before
    let courseRel = PFUser.currentUser()?.relationForKey("usercourses")
    let query = courseRel!.query()
    qObjects = query!.findObjects()!

In my tableView(cellForRowAtIndexPath):

    // Extract values from the PFObject to display in the table cell
    if contains(qObjects, { $0 === object }) {
        cell.accessoryType = UITableViewCellAccessoryType.Checkmark
        self.selectedRows.addIndex(indexPath.row)
    } else {
        cell.accessoryType = UITableViewCellAccessoryType.None
    }

Don't try to search for a cell. Well, you can, but not like you're trying to - I'll come back to that.

Your current code is creating new cells, not finding existing cells, so that won't work.

What you should really be doing is storing the array of returned objects, qObjects , and then when you're configuring the cell for display checking if that array contains the object for the current cell. If it does, tick it, otherwise remove the tick.

Now, if the load of qObjects happens after the view is shown you have 2 options:

  1. reload the table view
  2. update just the visible items

Option 2. is obviously better, especially if the user might be scrolling the list. To do that you want to use the array returned by calling indexPathsForVisibleRows on the table view. Then, iterate that list, get the associated object and check if it's in qObjects , then get the cell on display with cellForRowAtIndexPath: and update it.

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