【问题标题】:Why my tableView is repeating the last object? PFQuery using pointer为什么我的 tableView 重复最后一个对象? PFQuery 使用指针
【发布时间】:2016-02-09 21:47:10
【问题描述】:

我想列出当前用户所有喜欢的 ServiceProviders。一切正常,除了表格视图:它复制了最后一个对象。

有一个类Favorite:objectId、User(指向User的指针)、ServiceProvider(指向ServiceProvider的指针)。

func baseQuery() -> PFQuery {
    let favoriteQuery = PFQuery(className: "Favorite")
    favoriteQuery.whereKey("favoriteUser", equalTo:PFUser.currentUser()!)
    favoriteQuery.includeKey("favoriteServiceProvider")
    favoriteQuery.orderByDescending("createdAt")
    return favoriteQuery
}

override func queryForTable() -> PFQuery {
    return self.baseQuery().fromLocalDatastore()
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return objects!.count
}

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

    var cell = tableView.dequeueReusableCellWithIdentifier("favoriteCell") as! FavoriteTableViewCell!

    if cell == nil {
        cell = FavoriteTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "favoriteCell")
    }

    print("Founded \(objects!.count) favorite(s) from subquery")
    //print(objects)

    for object in objects! {

        if let favoriteServiceProvider = object["favoriteServiceProvider"] as? PFObject {

            let varspName = favoriteServiceProvider["spName"] as? String
            print("spName: \(varspName)")
            cell.labelspName.text = varspName

            let varspCity = favoriteServiceProvider["spCity"] as? String
            print("spCity: \(varspCity)")
            cell.labelspCity.text = varspCity

            let pictureUser: PFFile = (favoriteServiceProvider["spUserPhoto"] as? PFFile)!
            print("spServiceProviderPhoto: \(pictureUser)")
            pictureUser.getDataInBackgroundWithBlock { (data: NSData?, err: NSError?) -> Void in
                if data != nil{

                    //Rounded spPhoto
                    cell.imageViewUserPhoto.image = UIImage(data: data!)
                    cell.imageViewUserPhoto.layer.cornerRadius = cell.imageViewUserPhoto.frame.size.width / 2
                    cell.imageViewUserPhoto.clipsToBounds = true
                    cell.imageViewUserPhoto.layer.borderColor = UIColor.lightGrayColor().CGColor
                    cell.imageViewUserPhoto.layer.borderWidth = 2

                }
            }

            let varRating = favoriteServiceProvider["spAverageRating"] as? Int
            print("spAverageRating: \(varRating)")
            cell.ratingControl.rating = varRating!

        }
    }

    return cell

}

我可以找到 2 个收藏夹,没关系!

并且可以正确看到“打印”。

spName: Optional("Service Provider Name")
spCity: Optional("Florianópolis / SC")
spServiceProviderPhoto: <PFFile: 0x12fde9de0>
spAverageRating: Optional(5)

spName: Optional("Service Provider Name 2")
spCity: Optional("Florianópolis / SC")
spServiceProviderPhoto: <PFFile: 0x12ff7ca60>
spAverageRating: Optional(4)

一切看起来都很好,但是……应用程序只重复最后一个对象(显示两次相同的对象)。怎么了?

【问题讨论】:

  • 为什么每次创建单元格时都要遍历整个objects?也许这就是为什么你每次都得到相同的单元格的原因,因为它们最后都得到相同的object。您肯定需要一些 if 语句来为当前单元格选择正确的数据。

标签: swift pointers tableview relation pfquery


【解决方案1】:

您正在循环遍历每个单元格的 objects 集合。因此,每个单元格都会填充最后一个单元格的值。相反,您应该编制索引:

let object = objects[indexPath.row]

另外,dequeueReusableCellWithIdentifier 总是返回一个单元格,所以不需要检查 nil。

【讨论】:

  • 非常感谢。 :-)
  • 不用担心。您是否要接受答案以结束问题?
猜你喜欢
  • 1970-01-01
  • 2023-01-25
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多