2016-06-03 8 views
11

Я столкнулся с проблемой в своем приложении - вы можете публиковать и редактировать свои любимые места. После публикации сообщения или редактирования определенного сообщения (UITableViewCell) UITableview перезагружается.UITableview Scrolls to Top on Reload

Моя проблема: UITableview прокручивает кверху после перезагрузки. Но этого я не хочу. Я хочу, чтобы мое мнение оставалось в камере/в представлении, где я был. Но я не знаю, как это сделать.

Не могли бы вы мне помочь?

+1

Вы смотрели на метод UITableView: reloadRowsAtIndexPaths – Dominic

+0

взглянуть на этот ответ http://stackoverflow.com/questions/28043632/ авто-прокрутка в ячейку с конкретным значением, вам может потребоваться сохранить индекс, на который вы смотрите, когда вы перезагружаетесь, чтобы узнать, где прокрутить до –

ответ

7

Метод UITableViewreloadData() является явно принудительной перезагрузкой всего tableView. Он работает хорошо, но, как правило, раздражает и плохой пользовательский интерфейс, если вы собираетесь делать это с помощью таблицы, которую пользователь в настоящее время смотрит.

Вместо этого взгляните на reloadRowsAtIndexPaths(_:withRowAnimation:) и reloadSections(_:withRowAnimation:)in the documentation.

12

Чтобы предотвратить прокрутку вверх, вы должны сохранить высоту ячеек, когда они загружаются и дают точное значение в tableView:estimatedHeightForRowAtIndexPath:

// declare cellHeightsDictionary 
NSMutableDictionary *cellHeightsDictionary; 

// initialize it in ViewDidLoad or other place 
cellHeightsDictionary = @{}.mutableCopy; 

// save height 
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    [cellHeightsDictionary setObject:@(cell.frame.size.height) forKey:indexPath]; 
} 

// give exact height value 
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSNumber *height = [cellHeightsDictionary objectForKey:indexPath]; 
    if (height) return height.doubleValue; 
    return UITableViewAutomaticDimension; 
} 
14

ответ Игоря является правильным, если вы используете динамически изменяемый размер ячеек (UITableViewAutomaticDimension)

Здесь в быстром 3:

private var cellHeights: [IndexPath: CGFloat?] = [:] 
    var expandedIndexPaths: [IndexPath] = [] 

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
     cellHeights[indexPath] = cell.frame.height 
    } 

    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { 
     if let height = cellHeights[indexPath] { 
      return height ?? UITableViewAutomaticDimension 
     } 
     return UITableViewAutomaticDimension 
    } 


    func expandCell(cell: UITableViewCell) { 
     if let indexPath = tableView.indexPath(for: cell) { 
     if !expandedIndexPaths.contains(indexPath) { 
      expandedIndexPaths.append(indexPath) 
      cellHeights[indexPath] = nil 
      tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.automatic) 
      //tableView.scrollToRow(at: indexPath, at: .top, animated: true) 
     } 
     } 
    } 
0

в быстры 3.1

DispatchQueue.main.async(execute: { 

    self.TableView.reloadData() 
    self.TableView.contentOffset = .zero 

}) 
+0

вам не нужен Dispatch.main.async для этого. –

+0

@OsamaBinBashir не очень, но вы должны называть эти методы в основном потоке. –

+0

@EduardoIrias согласны с этим :) –

0

Просто идти на эти строки, если вы хотите простое решение

let contentOffset = tableView.contentOffset 
    tableView.reloadData() 
    tableView.setContentOffset(contentOffset, animated: false) 
Смежные вопросы