2016-06-30 5 views
2

Когда я заполняю новые данные в своем контроллере TableView, моя верхняя ячейка переписывается нижним. Позвольте мне объяснить. У меня есть одно изображение, загружающее async в последнюю строку ячейки, внизу. Все остальные ячейки загружаются статическими с изображением, которое находится в приложении. Когда я просматриваю свое приложение и показываю свою нижнюю ячейку, у которой другое изображение, чем другие ячейки, и я снова прокручиваю вверх, я вижу, что первое изображение магазина изменилось на динамическое, загруженное в нижнюю ячейку. Кто-нибудь знает, почему это происходит?Мои данные изменяются в UITableViewCell при прокрутке вниз и возвращаются

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell : shopsTableViewCell = tableView.dequeueReusableCellWithIdentifier("shopCell", forIndexPath: indexPath) as! shopsTableViewCell 

    cell.index = indexPath.row 
    let qualityOfServiceClass = QOS_CLASS_BACKGROUND 
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) 
    let apiCall = webApi() 


     dispatch_async(backgroundQueue, { 
      apiCall.downloadPhotoAsync("http://api-ytyg.wbbdev.com/files/shops/\(shops[indexPath.row].id)/\(shops[indexPath.row].featured_img)"){(image: UIImage?) -> Void in 
       dispatch_async(dispatch_get_main_queue()){ 
        if(image != nil){ 
         if (cell.index == indexPath.row){ 
    //       shops[indexPath.row].photo = image! 
          cell.shopImg?.image = image 
         } 

        }else{ 
         shops[indexPath.row].photo = UIImage.init(named: "No_Image_Available.jpg")! 
        } 
       } 
      } 
     }) 
    cell.shopName?.text = shops[indexPath.row].name 
    cell.shopDescription?.text = shops[indexPath.row].address 

    cell.label1?.text = shops[indexPath.row].city + " | " + shops[indexPath.row].distance + "Km" 
    cell.becomeFirstResponder() 
    return cell 
} 

enter image description here

enter image description here

enter image description here

+0

показать свою декларацию о shopImg и shopName, shopDescription –

+0

отредактирован, чтобы добавить пользовательский класс клеток является декларирование свойств вы просили – user3033437

+0

проверить мой ответ .. и почему бы вам не использовать библиотеку SDWebImage, его очень эффективен по сравнению со всем этим. он будет быстрее работать с кешем и всем –

ответ

3

это потому, что ваши клетки повторного использования:

// this line initialize a cell of type shopsTableViewCell 
//if no cell can be reused, get an already used cell else 
let cell : shopsTableViewCell 
       = tableView.dequeueReusableCellWithIdentifier("shopCell", 
            forIndexPath: indexPath) as! shopsTableViewCell 

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

Чтобы избежать этого, вы должны реализовать prepareForReuse в файле класса ячейки для сброса данных и изображений. docs of apple about prepareForReuse func

От компании Apple Документов

Если объект UITableViewCell является многоразовым, то есть, он имеет идентификатор, это повторное использование метод вызывается непосредственно перед тем, возвращается объект из метода dequeueReusableCellWithIdentifier UITableView :. По соображениям производительности вы должны только сбросить атрибуты ячейки, которые не связаны с контентом, например, альфа, редактирование и состояние выбора. Делегат табличного представления в tableView: cellForRowAtIndexPath: всегда должен перезагружать все содержимое при повторном использовании ячейки. Если у объекта ячейки нет связанного идентификатора повторного использования, этот метод не вызывается. Если вы переопределите этот метод, вы должны обязательно вызвать реализацию суперкласса.

//Example : 
override func prepareForReuse() { 
    super.prepareForReuse() 
    //Do reset here 
    this.shopImg?.image = nil 
    this.shopName?.text = "" 
    this.shopDescription?.text = "" 

} 
0

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

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

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return arrayThatcontainsShopImages.count 
} 

Примечание: что каждый раз, когда вы добавляете загруженное изображение в массив, вы должны вызвать tableView.reloadData()

Использование SDWebImage может быть гораздо выше. Посмотрите на следующий код, используя эту библиотеку, просто создайте экземпляр UIImageView. затем с помощью этой библиотеки вы можете скачать directy изображение в ImageView, например, и для доступа к изображению, вы можете использовать imageView.image свойство класса UIImageView

let imageView = UIImageView() 
imageView.sd_setImageWithURL(someURL, placeholderImage: UIImage()) 
self.arrayOfImageViews.append(imageView) 
+0

Большое спасибо. Это поможет мне. Я трачу часы на исправление этой проблемы. –

+0

@GregoryWilsonPullyattu Рад, что это помогло! –

Смежные вопросы