Почему индикатор активности отображается дважды

Я реализую индикатор активности, чтобы показать, пока изображение загружается / загружается. Однако индикатор активности иногда отображается дважды в одном кадре.

Я проверял код много раз и даже пробовал другие методы, такие как счетчик, соответствующий номеру строки. Есть идеи, почему это появляется дважды? (см. изображение ниже)

Код индикатора активности (внутри 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

исключает ячейку из табличного представления. Деску работает следующим образом:

  1. Он поддерживает очередь на основе идентификатора.
  2. Если в очереди нет ячейки, создается новая ячейка.
  3. Если ячейка уже есть, она возвращает эту ячейку вам. Который будет использоваться повторно.

Так что вы делаете, вы добавляете MaterialActivityIndicatorView каждый раз в ячейку, была ли она добавлена ​​ранее или нет.

Решение:

  1. Добавьте пользовательский вид в свою ячейку из xib и установите для его класса значениеMaterialActivityIndicatorView, И получить ссылку здесь, чтобы скрыть / показать и анимацию.
  2. Проверьте подвиды 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.
Другие вопросы по тегам