Почему индикатор активности отображается дважды
Я реализую индикатор активности, чтобы показать, пока изображение загружается / загружается. Однако индикатор активности иногда отображается дважды в одном кадре.
Я проверял код много раз и даже пробовал другие методы, такие как счетчик, соответствующий номеру строки. Есть идеи, почему это появляется дважды? (см. изображение ниже)
Код индикатора активности (внутри cellForRowAtIndexPath
):
// start indicator when loading images
var indicatorPhoto: MaterialActivityIndicatorView! = MaterialActivityIndicatorView(style: .Small)
indicatorPhoto.center = cell.mainRestaurantImageView.center
cell.mainRestaurantImageView.addSubview(indicatorPhoto)
indicatorPhoto!.startAnimating()
cell.mainRestaurantImageView.loadInBackground {
(success: UIImage!, error: NSError!) -> Void in
if ((success) != nil) {
// stop indicator when loading images
if indicatorPhoto?.isAnimating == true {
indicatorPhoto!.stopAnimating()
indicatorPhoto!.removeFromSuperview()
}
} else {
println("Unsuccessful Fetch Image")
if indicatorPhoto?.isAnimating == true {
indicatorPhoto!.stopAnimating()
indicatorPhoto!.removeFromSuperview()
}
}
}
Обновить:
Это остальная часть cellForRowAtIndexPath
код
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("RestaurantCell", forIndexPath: indexPath) as FeedCell
cell.nameLabel.text = restaurantNames[indexPath.row]
cell.photoNameLabel.text = photoNames[indexPath.row]
cell.cityLabel.text = " " + addressCity[indexPath.row]
cell.distanceLabel?.text = arrayRoundedDistances[indexPath.row] + "mi"
// check if there are images
if foodPhotoObjects.isEmpty { } else {
var restaurantArrayData = self.foodPhotoObjects[indexPath.row] as PFObject
cell.mainRestaurantImageView.image = UIImage(named: "") // set placeholder
cell.mainRestaurantImageView.file = restaurantArrayData["SmPhotoUploaded"] as PFFile
// start indicator when loading images
var indicatorPhoto: MaterialActivityIndicatorView! = MaterialActivityIndicatorView(style: .Small)
indicatorPhoto.center = cell.mainRestaurantImageView.center
cell.mainRestaurantImageView.addSubview(indicatorPhoto)
indicatorPhoto!.startAnimating()
cell.mainRestaurantImageView.loadInBackground {
(success: UIImage!, error: NSError!) -> Void in
if ((success) != nil) {
// stop indicator when loading images
if indicatorPhoto?.isAnimating == true {
indicatorPhoto!.stopAnimating()
indicatorPhoto!.removeFromSuperview()
}
} else {
println("Unsuccessful Fetch Image")
if indicatorPhoto?.isAnimating == true {
indicatorPhoto!.stopAnimating()
indicatorPhoto!.removeFromSuperview()
}
}
}
cell.mainRestaurantImageView.contentMode = .ScaleAspectFill
cell.mainRestaurantImageView.clipsToBounds = true
}
return cell
}
Обновление 2
// create indicator when loading images
var indicatorPhoto : MaterialActivityIndicatorView? = cell.mainRestaurantImageView.viewWithTag(123) as? MaterialActivityIndicatorView;
if indicatorPhoto == nil{
indicatorPhoto = MaterialActivityIndicatorView(style: .Small)
indicatorPhoto!.center = cell.mainRestaurantImageView.center
indicatorPhoto!.tag = 123
cell.mainRestaurantImageView.addSubview(indicatorPhoto!)
indicatorPhoto!.startAnimating()
}
1 ответ
Это отображается несколько раз, потому что вы добавляете его несколько раз. На самом деле каждый раз, когда еще случай foodPhotoObjects.isEmpty
называется.
Это потому, что первая строка вашего метода:
let cell = tableView.dequeueReusableCellWithIdentifier("RestaurantCell", forIndexPath: indexPath) as FeedCell
исключает ячейку из табличного представления. Деску работает следующим образом:
- Он поддерживает очередь на основе идентификатора.
- Если в очереди нет ячейки, создается новая ячейка.
- Если ячейка уже есть, она возвращает эту ячейку вам. Который будет использоваться повторно.
Так что вы делаете, вы добавляете MaterialActivityIndicatorView
каждый раз в ячейку, была ли она добавлена ранее или нет.
Решение:
- Добавьте пользовательский вид в свою ячейку из xib и установите для его класса значение
MaterialActivityIndicatorView
, И получить ссылку здесь, чтобы скрыть / показать и анимацию. - Проверьте подвиды
cell.mainRestaurantImageView
и посмотреть, есть ли ужеMaterialActivityIndicatorView
, получить его ссылку и сделать анимацию и прочее. Если нет подпредставления какMaterialActivityIndicatorView
, создайте его и добавьте в вид изображения как подпредставление. Для этого вы будете использовать свойство tag.
Второй подход можно сделать примерно так:
//first find the activity indication with tag 123, if its found, cast it to its proper class
var indicatorPhoto : MaterialActivityIndicatorView? = cell.mainRestaurantImageView.viewWithTag(123) as? MaterialActivityIndicatorView;
if indicatorPhoto == nil{
//seems it wasn't found as subview initialize here and add to mainRestaurantImageView with tag 123
}
//do rest of the stuff.