TTTableViewController scrollsToTop не работает - PullRequest
3 голосов
/ 21 сентября 2010

Я использую базовый Three20 TTTableViewController подкласс, который использует свой собственный источник данных и модель.

Проблема в том, что я не могу использовать свойство scrollsToTop таблицы.Это стандартное свойство для таблицы, унаследованное от UIScrollView и очень часто используемое.

Я пробовал все следующее в различных местах / методах в моем классе:

self.tableView.scrollsToTop = YES;
[self.tableView setScrollsToTop:YES]


Я также пытался переопределить метод

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
    return YES; 
}

Все безуспешно.

NB.Чтобы было ясно, я имею в виду стандартный жест касания в строке состояния для прокрутки видимого табличного представления вверх (т. Е. В первой строке).

Любая помощь очень ценится!

Ответы [ 4 ]

3 голосов
/ 01 августа 2011


Спасибо Vincent G за то, что указал мне правильное направление.Похоже, что проблема связана с тем, какой код вызывается в методах класса init и viewDidLoad.

Я обнаружил, что при следующих условиях два табличных представления добавляются как подпредставления представления контроллера представления:

  1. Создание ссылки на свойство tableView в методе viewDidLoad, например [[self tableView] setTableHeaderView:]

  2. Построение источника данных таблицы в init/ initWithStyle метод.

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

Редактировать: Кажется, что это может быть связано с тем, что метод viewDidLoad вызывается ДО инициации внекоторые случаи.Если ссылка сделана на представление таблицы в viewDidLoad, то до того, как оно было создано, я думаю, что класс создает его.Затем init сделает еще один.

3 голосов
/ 20 мая 2011

Существует некоторая путаница

Согласно документации Apple по UIScrollView :

scrollsToTop

Булево значение, которое управляет прокруткой.Жест-на-верх эффективен

Это просто сказать scrollview, что прикосновение к строке состояния сделает просмотр прокрутки к вершине.

То, что вы ищете это метод UITableView :

scrollToRowAtIndexPath: atScrollPosition: animated:

Прокручивает получатель до тех пор, пока строка, идентифицируемая индексным путем, не окажется в определенном месте на экране.

С three20

Поскольку вы используете three20, то, что вы хотите сделать, может быть легко сделано благодаря UITableView+Additions.h> - (void)scrollToFirstRow:(BOOL)animated

[self.tableView scrollToFirstRow:YES];

Без three20

Если не использовать three20, вот как three20 делает:

- (void)scrollToFirstRow:(BOOL)animated {
  if ([self numberOfSections] > 0 && [self numberOfRowsInSection:0] > 0) {
    NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop
          animated:NO];
  }
}

Другой способ сделать это

Я думаю, что это также будет работать (не проверено), используя UIScrollView напрямую (тоже извлечено из three20):

- (void)scrollToTop:(BOOL)animated {
  [self setContentOffset:CGPointMake(0,0) animated:animated];
}

или:

[self.tableView setContentOffset:CGPointMake(0,0) animated:YES];
1 голос
/ 22 сентября 2010

попробуйте это:

self.tableview.scrollingEnabled=YES;<br> self.tableview.scrollsToTop=YES;

Также убедитесь, что ваш делегат возвращает YES в этом методе:

scrollViewWillScrollToTop:

0 голосов
/ 29 июля 2011

Как подсказал @imnk, мои мысли как ответ, хотя у меня нет реального решения.

Что я испытываю (и только что проверил), так это то, что, как только я изменяю свойство frame в tableView, касание строки состояния больше не работает ...

Согласно документации Apple на UIScrollViewDelegate , каждый делегат scrollView (независимо от его размера) может вернуть YES на - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView.

Но я просмотрел три20 и изменил его в своих реализациях делегатов, но безуспешно.

...