2013-05-14 2 views
4

У меня есть контроллер с раздельным представлением: вид & tableview. В этом представлении таблицы у меня есть пользовательские ячейки с текстовым полем. Я не знаю, сколько ячеек у меня будет, поэтому он будет генерироваться автоматически. И теперь я пытаюсь прокручивать текстовое поле, когда оно становится FirstResponder. Я пробовал что-то вроде этого:Получить позицию ячейки или текстовое поле в этой ячейке

-(void) textFieldDidBeginEditing:(UITextField *)textField { 
    CGPoint focusOnTextField = CGPointMake(0, 300 + textField.frame.origin.y); 
    [scroller setContentOffset: focusOnTextField animated: YES]; 
} 

300px - начальная позиция моего TableView. Все выглядит хорошо, но textField.frame.origin.y всегда равно 0 (например, и bounds.origin.y).

Я думал, что могу решить проблему, если получить позицию ячейки, в которой текстовое поле активно, а затем заменить textField.frame.origin.y на cell.frame.origin.y или что-то в этом роде.

=================================================================================================================================================== =================================

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

- (UITableViewCell *)cellWithSubview:(UIView *)subview { 

    while (subview && ![subview isKindOfClass:[UITableViewCell self]]) 
     subview = subview.superview; 
    return (UITableViewCell *)subview; 
} 

- (void)textFieldDidBeginEditing:(UITextField *)textField { 
    UITableViewCell *activeCell = [self cellWithSubview:textField]; 

    float offsetValueY = 200 + activeCell.origin.y; 
    CGPoint focusOnTextField = CGPointMake(0, offsetValueY); 
    [scroller setContentOffset:focusOnTextField animated:YES]; 
} 

И знаете что? Работает! :-) Но это создает новую проблему. Когда я начинаю редактировать текстовое поле, скроллер сначала прыгает сверху, а только потом подходит к правильной позиции. Когда я пишу [scroller setContentOffset:focusOnTextField animated:NO];, и эта проблема исчезает, но плавного перемещения скроллера нет. И это плохо для меня :-) Итак, как мы можем это решить?

ответ

5

Вот как перейти к ячейке, содержащей текстовое поле ...

// find the cell containing a subview. this works independently of how cells 
// have been constructed. 

- (UITableViewCell *)cellWithSubview:(UIView *)subview { 

    while (subview && ![subview isKindOfClass:[UITableViewCell self]]) 
     subview = subview.superview; 
    return (UITableViewCell *)subview; 
} 

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

- (void)textFieldDidBeginEditing:(UITextField *)textField { 

    // find the cell containing this text field 
    UITableViewCell *cell = [self cellWithSubview:textField]; 

    // now scroll using that cell's index path as the target 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} 
2

Если вы добавили текстовое поле в виде содержимого UITableVieCell (добавлено по умолчанию, если вы используете .xib), тогда вам нужно называть что-то вроде textField.superview.superview, и это даст вам родительскую ячейку. Если вы добавите текстовое поле непосредственно в представление ячеек, вы должны указать textField.superview.

1
[tableView scrollToRowContainingComponent:textField atScrollPosition: UITableViewScrollPositionMiddle animated:YES]; 

после добавления следующей категории в UITableView:

@implementation UITableView (MyCategory) 

-(NSIndexPath*)indexPathOfCellComponent:(UIView*)component { 
    if([component isDescendantOfView:self] && component != self) { 
     CGPoint point = [component.superview convertPoint:component.center toView:self]; 
     return [self indexPathForRowAtPoint:point]; 
    } 
    else { 
     return nil; 
    } 
} 

-(void)scrollToRowContainingComponent:(UIView*)component atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated { 

    NSIndexPath *indexPath = [self indexPathOfCellComponent:component]; 
    if(indexPath) { 
     [self scrollToRowAtIndexPath:indexPath atScrollPosition: scrollPosition animated:animated]; 
    } 
} 

@end 
Смежные вопросы