2016-06-03 13 views
11

Ich habe ein Problem in meiner App - Sie können Ihre Lieblingsorte posten und bearbeiten. Nach dem Posten eines Beitrags oder Bearbeiten eines bestimmten Beitrags (UITableViewCell) wird UITableview erneut geladen.UITableview Scrolls nach oben auf Nachladen

Mein Problem ist: Die UITableview scrollt nach dem Neuladen nach oben. Aber das will ich nicht. Ich möchte, dass meine Sicht auf der Zelle bleibt, in der ich war. Aber ich weiß nicht, wie ich das schaffen soll.

Können Sie mir helfen?

+1

Haben Sie bei der UITableView Methode sah: reloadRowsAtIndexPaths – Dominic

+0

haben einen Blick auf diese Antwort http://stackoverflow.com/questions/28043632/ Auto-Scrolling-to-a-Cell mit einem bestimmten Wert müssen Sie möglicherweise den Index speichern, den Sie beim Neuladen betrachten, um zu wissen, wo Sie zu –

Antwort

7

Die Methode UITableViewreloadData() ist explizit ein Force-Reload der gesamten TabelleView. Es funktioniert gut, ist jedoch in der Regel unruhig und eine schlechte Benutzererfahrung, wenn Sie das mit einer Tabellenansicht tun, die der Benutzer gerade betrachtet.

Schauen Sie stattdessen reloadRowsAtIndexPaths(_:withRowAnimation:) und reloadSections(_:withRowAnimation:)in the documentation.

12

Scrollen Um zu verhindern, nach oben, sollten Sie Höhen von Zellen speichern, wenn sie lädt und die genauen Wert in tableView:estimatedHeightForRowAtIndexPath geben:

// 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

Igor Antwort richtig ist, wenn Sie dynamisch veränderbare Zellen (UITableViewAutomaticDimension)

verwenden

Hier ist es in schnellen 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

in swift 3.1

DispatchQueue.main.async(execute: { 

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

}) 
+0

blättern können. Sie brauchen dafür nicht Dispatch.main.async. –

+0

@OsamaBinBashir nicht wirklich, aber Sie müssen diese Methoden auf den Hauptthread aufrufen. –

+0

@EduardoIrias stimme zu :) –

0

für diese Linien gehen nur, wenn Sie eine einfache Lösung wollen

let contentOffset = tableView.contentOffset 
    tableView.reloadData() 
    tableView.setContentOffset(contentOffset, animated: false) 
Verwandte Themen