2016-03-08 6 views
-1

Я использую tableView, вручную кэшированные ячейки, но когда я прокручиваю, я получаю небольшое отставание. Это мой код:UITableView отставание при прокрутке

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
{ 


    var realRow = indexPath.row/2 
    if indexPath.row/2 > self.SUGGESTED_USERS_RATE && suggestedUsers.count > 0 
    { 
     --realRow 
    } 
    if indexPath.row/2 > self.SUGGESTED_RADIOS_RATE && suggestedRadioStations.count > 0 
    { 
     --realRow 
    } 

    if indexPath.row % 2 == 1 
    { 
     return self.CELL_MARGIN 
    } 
    else if indexPath.row/2 == self.SUGGESTED_USERS_RATE && suggestedUsers.count > 0 
    { 
     return self.SUGGESTED_USERS_CELL_HEIGHT 
    } 
    else if indexPath.row/2 == self.SUGGESTED_RADIOS_RATE && suggestedRadioStations.count > 0 
    { 
     return self.SUGGESTED_USERS_CELL_HEIGHT 
    } 
    else 
    { 
     return self.CELLS_HEIGHT[realRow]//[indexPath.row/2 - indexPath.row/(self.SUGGESTED_USERS_RATE * 2 + 2)] 
    } 

// пусть строка = indexPath.row/2

} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    var realRow = indexPath.row/2 

    if indexPath.row/2 > self.SUGGESTED_USERS_RATE && suggestedUsers.count > 0 
    { 
     --realRow 
    } 
    if indexPath.row/2 > self.SUGGESTED_RADIOS_RATE && suggestedRadioStations.count > 0 
    { 
     --realRow 
    } 




    if indexPath.row % 2 == 1 
    { 
     let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "") 
     cell.backgroundColor = UIColor.grayColor().colorWithAlphaComponent(0.3) 

     cell.selectionStyle = .None 

     addSeperatorsToView(cell.contentView, width: self.bounds.width, 
      height: self.CELL_MARGIN, up: true, down: true, left: false, right: false) 

     return cell 
    } 
    else if indexPath.row/2 == self.SUGGESTED_RADIOS_RATE && suggestedRadioStations.count > 0 
    { 
     let cell = SuggestedUsersCell(width: self.bounds.width, height: self.SUGGESTED_USERS_CELL_HEIGHT, radios: suggestedRadioStations.prefix(5) + []) 
     return cell 
    } 
    else if indexPath.row/2 == self.SUGGESTED_USERS_RATE && suggestedUsers.count > 0 
    { 
     let cell = SuggestedUsersCell(width: self.bounds.width, height: self.SUGGESTED_USERS_CELL_HEIGHT, users: suggestedUsers.prefix(5) + []) 
     return cell 
    } 
    else 
    { 
     var cell : ActivityTableViewCell 

     if let myCell = self.cells_cache[realRow] 
     { 
      cell = myCell 
     } 
     else 
     { 
      let activity = self.actevetiesArr[realRow] 

      cell = ActivityTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: self.CELL_ID, 
       height: self.CELLS_HEIGHT[realRow], 
       width: self.bounds.width, activity: activity , 
       index : realRow , 
       delegate : self) 

      self.cells_cache[realRow] = cell 

     } 



     cell.userInteractionEnabled = true 
     cell.selectionStyle = .None 

     return cell 
    } 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    var count = self.actevetiesArr.count * 2 

    if self.actevetiesArr.count > self.SUGGESTED_USERS_RATE 
    { 
     count = count + 2 
    } 
    if self.actevetiesArr.count > self.SUGGESTED_RADIOS_RATE 
    { 
     count = count + 2 
    } 

    if self.actevetiesArr.count < max(self.SUGGESTED_USERS_RATE , self.SUGGESTED_RADIOS_RATE) 
    { 
     count += 2 
     self.SUGGESTED_RADIOS_RATE = 1 
     self.SUGGESTED_USERS_RATE = 0 
    } 
    else 
    { 
     self.SUGGESTED_USERS_RATE = SUGGESTED_USERS_INDEX 
     self.SUGGESTED_RADIOS_RATE = SUGGESTED_RADIOS_INDEX 
    } 

    if suggestedRadioStations.count == 0 
    { 
     count -= 2 
    } 

    if suggestedUsers.count == 0 
    { 
     count -= 2 
    } 

    return count//(self.actevetiesArr.count + (self.actevetiesArr.count 
} 

чем проблема ??! , Я не делаю огромное количество кода в cellForRowAtIndexPath. Примечание: cell_cache является словарем ==> [Int: ActivityTableViewCell

+1

Используйте инструменты, чтобы узнать, какая часть вашего кода вызывает отставание. – Koen

+0

вы проверили http://stackoverflow.com/a/35868056/2963912 – techloverr

ответ

0

добавить

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return 44; 
} 

или вы можете добавить

self.tableView. estimatedRowHeight = 44.0 в viewDidLoad

дайте мне знать, если он работает

+1

Он должен работать. Этот делегат определенно улучшает производительность прокрутки таблицы. –

+1

В качестве альтернативы, поместите 'self.tableView.estimatedRowHeight = 44.0' в' viewDidLoad' – Koen

1

Попробуйте использовать повторно используемую ячейку.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = (CustomCell *) [[[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil] objectAtIndex:0]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 
    return cell; 
} 
+0

Я не могу использовать многоразовые ячейки, потому что есть много типов ячеек, мое решение состояло в том, чтобы сохранить их по словарю – user3703910

+0

Затем передумайте свой дизайн. Если вам нужна производительность, многоразовые ячейки - это путь. – Koen

2

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

+0

Я не могу использовать многоразовые ячейки, потому что есть много типов ячеек, мое решение состояло в том, чтобы сохранить их в словаре – user3703910

+3

У вас нет выбора. Вы должны правильно организовать свои ячейки и повторно использовать их. Это не проблема, если у вас будет 10-15 различных пользовательских ячеек и зарегистрируйте их ВСЕ :) –

+1

Нет никакого оправдания не использовать механизм повторного использования элементов tableView. – vikingosegundo