2013-06-21 5 views
2

У меня есть 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 вручную, все работает нормально.

У вас есть идеи, почему это происходит и как я могу решить эту проблему?

Спасибо,

+2

почему вы не добавить [cell.textField becomeFirstResponder]; in didselectrowAtIndexPath Вместо того, чтобы в cellForRowAtIndexPath. –

+0

Это не работает. Только текстовое поле отображается, когда я хочу, чтобы вся ячейка была видимой. Благодарю. –

+0

Невозможно добавить разницу между TextField и всей ячейкой в ​​пикселях для ваших вычислений, чтобы увидеть всю ячейку? – Jasper

ответ

0
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, coveredFrame.size.height, 0.0); 

должен изменен следующим образом:

UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, -coveredFrame.size.height, 0.0); 
+0

Возможно, вы захотите подробно рассказать о причинах и о том, как это исправлено. – Leigh