2015-08-27 3 views
0

Моя цель - просто отобразить уникальное изображение и метку для каждой строки в моем представлении таблицы. Это в настоящее время, где я нахожусь:Как сделать мой табличный вид менее слабым в Swift?

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)-> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! DailyBarCellViewTableViewCell 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0)) { 
      let data = DailyBarCellViewTableViewCell.Static.data 
     dispatch_async(dispatch_get_main_queue()) { 
      cell.barName?.text = data.namesArray[indexPath.row] 
     } 
    } 

    return cell 
} 

Содержание CellDataDisplayInformation:

struct CellDataDisplayInformation { 
    var namesArray : [String?] = [] 
    var pictureArray : [UIImage?] = [] 

    init(){ 
     for index in 0...21 { 
      var data = BarDetails(index: index) 
      if data.barName != nil && data.barImage != nil { 

       namesArray.append(data.barName!) 
       pictureArray.append(data.barImage!) 


      } 
     } 

    } 

    } 

data = CellDataDisplayInformation() держит массивы [Strings?] И [UIImages?], Которые будут отображаться в каждой соответствующей ячейке. С помощью этого метода пользовательский интерфейс первоначально загружается со всей необходимой информацией в каждой ячейке. Однако, когда я прокручиваю вниз до невидимых ячеек, метки в каждой ячейке перемешиваются в течение 2 секунд, а затем перемещаются в правильные места.

Если я не использую «отправка» и просто сделать:

let data = CellDataDisplayInformation() 
cell.barName?.text = data.namesArray[indexPath.row] 

Все метки для каждой ячейки остаются постоянными и не тасовать, но вид запаздывает, как я прокручивать над каждой новой ячейки.

Итак, в заключение, как избежать перетасовки и задержки при отображении данных в ячейках таблицы?

Мой DailyBarCellViewTableViewCell класс:

class DailyBarCellViewTableViewCell: UITableViewCell { 

// MARK: Properties 

    struct Static { 
    static var data = CellDataDisplayInformation() 
    } 

@IBOutlet weak var barName: UILabel! 


override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
    self.barName.text = nil 
} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    // Configure the view for the selected state 
} 

override func prepareForReuse() { 
    self.barName.text = nil 
    super.prepareForReuse() 
    } 

} 
+0

Трудно определить, что это может привести к этому. Опубликовать реализацию CellDataDisplayInformation. – Sebyddd

ответ

0

В dispatch_async вызовы приводят к cell.barName?.text = data.namesArray[indexPath.row] выполняется после возвращения в cell в -cellForRowAtIndexPath. Вы не должны этого делать, потому что эти ячейки, возможно, уже были повторно использованы для какой-либо другой строки к моменту получения данных.

Вместо того, чтобы указывать текст на этом cell, вам нужно попросить таблицу о продаже ячейки для индекса, на который вы извлекли данные. если этот индекс все еще находится на экране к моменту получения ваших данных, таблицаView предоставит вам правильную ячейку. в противном случае он возвращает nil.

Как это:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! DailyBarCellViewTableViewCell 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0)) { 

     let data = CellDataDisplayInformation() 

     dispatch_async(dispatch_get_main_queue()) { 

      //do it this way 
      if let futureCell = tableView.cellForRowAtIndexPath(indexPath) as? DailyBarCellViewTableViewCell { 
       futureCell.barName?.text = data.namesArray[indexPath.row] 
      } 
     } 
    } 

    return cell 
} 
+0

Спасибо за ответ Nic. Только один последний вопрос, если можно. Как заставить FutureCell соответствовать моему пользовательскому классу ячеек? –

+0

Да, мое приложение просто отлично работает, а прокрутка стола гладкая. Однако имена по-прежнему перетасовываются, когда я прокручиваю вниз :( –

+0

ах, тогда вам нужно опубликовать весь код для 'DailyBarCellViewTableViewCell' – Nick

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