解析和斯威夫特。从 Parse 关系中设置 tableViewCell 附件类型

Posted

技术标签:

【中文标题】解析和斯威夫特。从 Parse 关系中设置 tableViewCell 附件类型【英文标题】:Parse and Swift. Set tableViewCell accessory type from Parse relation 【发布时间】:2015-06-04 11:50:04 【问题描述】:

所以,我有一个显示课程的 tableView。用户可以在这些课程(单元格)上设置复选标记并将它们保存在他的 PFUser 对象中,作为与 Courses 类(所有课程都存储在其中)的关系。 我的问题是,我如何检查用户之前保存的课程。

这是我的尝试,但我不知道如何继续。如何获取具有特定标签的单元格? (或者有没有更好的方法?)

    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")

        

    

编辑:该代码在我的覆盖 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

行中的错误 ‚if contains(qObjects, object) '

通用参数“S.Generator.Element”不能绑定到非@objc协议类型“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:(工作代码)

在课堂上:

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

在我的 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()!

在我的 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
    

【问题讨论】:

【参考方案1】:

不要尝试搜索单元格。好吧,你可以,但不像你想要的那样 - 我会回到那个。

您当前的代码正在创建新单元格,而不是查找现有单元格,因此这不起作用。

您真正应该做的是存储返回对象数组qObjects,然后在配置单元格以进行显示时检查该数组是否包含当前单元格的对象。如果是,请勾选,否则取消勾选。

现在,如果 qObjects 的负载发生在视图显示后,您有 2 个选项:

    重新加载表格视图 只更新可见项

选项 2. 显然更好,尤其是当用户可能正在滚动列表时。为此,您需要使用通过在表视图上调用 indexPathsForVisibleRows 返回的数组。然后,迭代该列表,获取关联对象并检查它是否在 qObjects 中,然后使用 cellForRowAtIndexPath: 获取显示的单元格并更新它。

【讨论】:

感谢您的回答。问题是,我正在使用 PFQueryTableViewController 类,它为我完成所有配置。知道我怎么能在那堂课上做到吗?我知道,可以用objects获取tableview中的objects!,但是不知道怎么获取object的cell…… 一样,都是按索引路径 好的,所以我需要使用 'dequeueReusableCellWithIdentifier(„courseCell“, forIndexPath: indexPath)”,对吧?但是我如何获得我的索引路径?我的表格视图中有部分。所以'NSIndexPath(forItem ...)',但我如何才能为每个部分的每一行运行它? (我需要将它们与我的 qObjects 进行比较,对吗?) 不,dequeue 创建一个新单元格,您使用cellForRowAtIndexPath: - 您是否阅读了我的答案并理解了该方法?您不是要刷新所有内容,如果您想这样做,只需重新加载表格 嗯,不完全是。我的问题仍然是,我没有在我的代码中配置单元格。 PFQueryTableViewController 类在后台执行此操作。那么,如何让我的所有部分中的所有单元格将它们与我的 qObjects 数组进行比较? (我假设我需要某种循环,但我首先需要找出有多少行/部分以及我有多少部分,对吧?)

以上是关于解析和斯威夫特。从 Parse 关系中设置 tableViewCell 附件类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中设置推送通知

mapreduce中设置自定义的输入类,进行文本解析(默认以tab键为分隔符)

在 Objective-C 中设置一个新的 Parse 服务器

斯威夫特 - 1.2,解析 - 1.7.4,缓存策略

如何更新之前在代码中设置的 NSLayoutConstraint 常量? - 斯威夫特

如何在 UIImage 数组中设置第二张或中间的图像? (斯威夫特 3)