scrollToRowAtIndexPath не прокручивается до неактивных / выгруженных ячеек - PullRequest
4 голосов
/ 29 марта 2012

Я заметил, что scrollToRowAtIndexPath:atScrollPosition:animated: не прокручивает до ячейки, которая в данный момент не отображается, поэтому, если у меня 100 ячеек и мне нужно перейти к той, которая находится на 70, вызов этого селектора ничего не сделает.

Есть ли способ, как я могу поместить эту ячейку в память? У меня уже есть путь индекса ячейки ...

Мне нужно прокрутить эту позицию в моем приложении, когда пользователь захочет перейти туда.

Спасибо за любые мысли!

РЕДАКТИРОВАТЬ: @dasblinkenlight

- (void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide) name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillHide
{
    //Load remote cell here then scroll
    // :( dont know how to load remote cell yet
}

- (void)keyboardWillShow
{
    //Load remote cell here then scroll
    // :( dont know how to load remote cell yet
    //_cellIndexPath gets assigned on didSelectRowAtIndexPath:
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:_cellIndexPath.row inSection:_cellIndexPath.section] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}

EDIT2:

- (void)keyboardWillShow
{
//Load remote cell here then scroll
    [NSThread detachNewThreadSelector:@selector(keyboardWillShowThreaded) toTarget:self withObject:nil];
}

- (void)keyboardWillShowThreaded
{
    [NSThread sleepForTimeInterval:2.0];
    [self performSelectorOnMainThread:@selector(keyboardWillShowMainThread) withObject:nil waitUntilDone:YES];
}

- (void)keyboardWillShowMainThread
{
    //Get the cell
    //_textFieldThatHasFirstResponder is a subview in the cell
    //This returns null, probably because the cell is not loaded into memory
    UITableViewCell *cell = [_textFieldThatHasFirstResponder superview];
    NSLog(@"CELL TO SCROLL TO: %@",cell);
    NSIndexPath *indexPathForCell = [self.tableView indexPathForCell:cell];
    [self.tableView scrollToRowAtIndexPath:indexPathForCell atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}

Ответы [ 4 ]

1 голос
/ 29 октября 2012

ОК, у меня есть причина этого, видите, у вас есть:

NSIndexPath *indexPathForCell = [self.tableView indexPathForCell:cell]; // nil here
[self.tableView scrollToRowAtIndexPath:indexPathForCell atScrollPosition:UITableViewScrollPositionMiddle animated:YES];

Когда вы отправляете indexPathForCell: для ячейки вне поля зрения, она возвращает nil, поэтому tableViewне знаю, куда прокрутить.

0 голосов
/ 29 марта 2012

"Я заметил, что scrollToRowAtIndexPath:atScrollPosition:animated: не выделять ячейку, которая в данный момент не отображается, поэтому если у меня есть 100 ячеек и мне нужно добраться до одного в 70, звонок на что селектор ничего не сделает. «

Нет. это не правда. Я только что попробовал с таблицей с 100 строками. Следующий код работает хорошо.

 [tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:78 inSection:0]
                     atScrollPosition:UITableViewScrollPositionNone animated:YES];
0 голосов
/ 27 июля 2012

Я не думаю, что добавление сна что-то меняет. Это просто задерживает выполнение, но не влияет на порядок. Можете ли вы проверить, является ли индекс, который вы передаете scrollToRowAtIndexPath, действительным? Я помню, видел ту же проблему сам, но это было связано с невидимой клеткой. Было невозможно получить невидимую ячейку (tableView вернул ноль), и поэтому его путь индекса был ноль, и, следовательно, прокрутка не удалась. Вы можете хранить местоположения всех ячеек или вычислить их на лету, а затем передать их

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;

Это единственное решение, которое я могу себе представить.

0 голосов
/ 29 марта 2012

вы можете реализовать делегата, чтобы вы могли вызывать его из класса, в котором вы находитесь, чтобы он мог обновить позицию

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