2016-02-09 5 views
-1

Я хочу перечислить всех любимых ServiceProviders от текущего пользователя. Все работает правильно, за исключением вида таблицы: его дублирование последнего объекта.Почему мой tableView повторяет последний объект? PFQuery с помощью указателя

Существует класс Favorite: objectId, 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) 

Все выглядит, как будет хорошо, но ... приложение повторяет только последний объект (показаны два раза и тот же объект). Что не так?

+0

Почему вы создаете целые «объекты» каждый раз, когда создаете свою ячейку? возможно, именно поэтому вы получаете такую ​​же ячейку каждый раз, так как все они заканчиваются тем же самым последним «объектом». Вам определенно понадобится инструкция 'if', чтобы выбрать правильные данные для вашей текущей ячейки. – Breek

ответ

1

Вы просматриваете коллекцию objects для каждой ячейки. Поэтому каждая ячейка заполняется значениями последней ячейки. Вместо этого вы должны быть индексирование:

let object = objects[indexPath.row] 

Кроме того, dequeueReusableCellWithIdentifier всегда возвращает ячейку, поэтому нет необходимости проверять ноль.

+0

Большое спасибо. :-) –

+0

Не беспокойтесь. Вы хотите принять ответ, чтобы закрыть вопрос? – Michael