Как заставить UITableview перейти на верх страницы при перезагрузке? - PullRequest
30 голосов
/ 04 апреля 2011

Я пытаюсь заставить UITableview перейти в начало страницы, когда я перезагружаю данные таблицы, когда я вызываю следующее из

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

// A bunch of code …

[TableView reloadData];
}

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

Я попытался разместить следующее, что, кажется, применимо только к строке, до и после перезагрузки, но ничего не происходит:

[TableView scrollToRowAtIndexPath:0 atScrollPosition:UITableViewScrollPositionTop  animated:YES];

Ответы [ 12 ]

61 голосов
/ 05 апреля 2011

Вот еще один способ сделать это:

Objective-C

[tableView setContentOffset:CGPointZero animated:YES];

Swift 3

tableView.setContentOffset(.zero, animated: true)

Вероятно, самый простой и простой способ сделать этоэто.

27 голосов
/ 16 декабря 2016

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

func reloadAndScrollToTop() {
    tableView.reloadData()
    tableView.layoutIfNeeded()
    tableView.contentOffset = CGPoint(x: 0, y: -tableView.contentInset.top)
}
18 голосов
/ 05 апреля 2011

Чтобы перейти к определенному разделу, вам нужно указать путь к нему:

NSIndexPath *topPath = [NSIndexPath indexPathForRow:0 inSection:0];
[TableView scrollToRowAtIndexPath:topPath
                 atScrollPosition:UITableViewScrollPositionTop
                         animated:YES];

Если вы не уверены в количестве строк в вашем табличном представлении.Используйте следующее:

NSIndexPath *topPath = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
[TableView scrollToRowAtIndexPath:topPath
                 atScrollPosition:UITableViewScrollPositionTop
                         animated:YES];
16 голосов
/ 05 января 2018

Это работает для меня.

tableView.scrollToRow(at: IndexPath.init(row: 0, section: 0), at: .top, animated: true)
7 голосов
/ 30 мая 2018

БЕЗ АНИМАЦИИ

Я на iOS11, использую простой стиль просмотра таблицы с липкими заголовками и каким-то образом единственный способ, которым я получил это, чтобы правильно работать, чтобы иметьпосле перезагрузки табличное представление было на самом верху без каких-либо странных мерцаний / анимации, это было использовать эти методы в таком порядке, где ВСЕ они необходимы:

[self.tableView setContentOffset:CGPointZero animated:NO];
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
[self.tableView setContentOffset:CGPointZero animated:NO];

Я серьезно, что все это необходимо,хотя кажется, что первая строка вообще не актуальна.Ах да, также очень важно , НЕ используйте это:

self.tableView.contentOffset = CGPointZero;

Вы могли бы подумать, что это то же самое, что "setContentOffset animated: FALSE", но, очевидно, это не так!Apple относится к этому методу по-другому, и в моем случае это работало только при использовании полного метода с анимированным: FALSE.

с анимацией

Я такжехотел попробовать это с хорошей прокруткой анимации наверх.Там методы смещения контента, похоже, по-прежнему вызывают странное поведение анимации.Единственный способ заставить меня работать с хорошей анимацией после некоторой проб и ошибок - эти методы в точном порядке:

[self.tableView reloadData];
[self.tableView layoutIfNeeded];
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:TRUE];

Предупреждение, убедитесь, что у вас есть хотя бы 1 строка перед запуском последней строки кодачтобы избежать сбоев :)

Надеюсь, это когда-нибудь кому-нибудь поможет!

4 голосов
/ 04 апреля 2011

UITableView является подклассом UIScrollView, поэтому вы также можете использовать:

[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
1 голос
/ 11 июля 2018

Вы должны прокрутить UITableView в первой строке вашего табличного представления, используя эту строку кода:

self.yourTableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
1 голос
/ 25 апреля 2017

В быстром 3,1

DispatchQueue.main.async(execute: {

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

    })
0 голосов
/ 14 мая 2019

После рассмотрения вариантов, рассмотренных выше, мой вариант решения выглядит следующим образом.Он работает последовательно в iOS 11 и 12 для UICollectionView и UITableView.

UICollectionView:

DispatchQueue.main.async { [weak self] in
    guard self?.<your model object>.first != nil else { return }

    self?.collectionView.scrollToItem(at: IndexPath(row: 0, section: 0),
                               at: .top,
                                     animated: false)
}

UITableView:

DispatchQueue.main.async { [weak self] in
    guard self?.<your model object>.first != nil else { return }

    self?.collectionView.scrollToRow(at: IndexPath(row: 0, section: 0),
                               at: .top,
                                     animated: false)
}
0 голосов
/ 21 февраля 2019

Для тех, кто все еще находит решение этой проблемы, вы можете использовать следующее расширение UITableView.

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

extension UITableView {

    func scrollToFirst() {

        self.reloadData() // if you don't want to reload data, remove this one.
        for i in 0..<self.numberOfSections {

            if self.numberOfRows(inSection: i) != 0 {

                self.scrollToRow(at: IndexPath(row: 0, section: i), at: .top, animated: true) 
                break 
            }
        }
    }
}

Надежда, которая помогла вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...