У меня есть UITableView
, загруженный пользовательскими ячейками. Эти ячейки имеют два возможных состояния: состояние только для чтения и состояние издания. Я переключаться между ними, нажав на соответствующую строку в виде таблицы:UITableView не прокручивает ячейки до видимых после того, как UITextField становится первым ответчиком
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomClass *aCustomClass = [self.model objectAtIndex:indexPath.row];
[aCustomClass setEdition:YES];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}
Проблема заключается в том, что мне нужно установить UITextField
как первый ответчик ячейки после нажатия на строку. Что я сделал, это добавить следующий код:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
if (!cell)
cell = ... // Create cell
...
[cell.textField becomeFirstResponder];
}
Все работает хорошо, но когда UITextField
становится первым респондентом я хочу посмотреть таблицу, чтобы прокрутить всю ячейку видимым. Для этого я реализовал событие уведомления клавиатуры, как это:
- (void)keyboardWillBeShown:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGRect kbRawRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect ownFrame = [self.tableView.window convertRect:self.tableView.frame fromView:self.tableView.superview];
// Calculate the area that is covered by the keyboard
CGRect coveredFrame = CGRectIntersection(ownFrame, kbRawRect);
coveredFrame = [self.tableView.window convertRect:coveredFrame toView:self.tableView.superview];
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, coveredFrame.size.height, 0.0);
self.tableView.contentInset = contentInsets;
self.tableView.scrollIndicatorInsets = contentInsets;
[self.tableView scrollToRowAtIndexPath:self.openCellIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
Проблема заключается в том, как таблица не прокручивать ячейки в верхнее положение, так как последняя строка указывает.
Если я удалю автоматический вызов becomeFirstResponder
и коснитесь UITextField
вручную, все работает нормально.
У вас есть идеи, почему это происходит и как я могу решить эту проблему?
Спасибо,
почему вы не добавить [cell.textField becomeFirstResponder]; in didselectrowAtIndexPath Вместо того, чтобы в cellForRowAtIndexPath. –
Это не работает. Только текстовое поле отображается, когда я хочу, чтобы вся ячейка была видимой. Благодарю. –
Невозможно добавить разницу между TextField и всей ячейкой в пикселях для ваших вычислений, чтобы увидеть всю ячейку? – Jasper