1

我正在 tableview 控制器中创建一个带有文本字段的表单。在为字段输入值后按下返回键时,我试图在这里实现两件事:

1) 将光标移动到下一个字段 2) 向上滚动表格视图

我的代码正在将光标移动到下一个字段,但滚动部分不起作用。你能告诉我我在这里缺少什么吗?我研究了有关堆栈溢出的类似问题,并遵循他们的建议,但仍然面临问题。感谢您的投入。

- (BOOL)textFieldShouldReturn:(UITextField *)textField{

    if ([textField isEqual:self.firstName]){
    //Move cursor to next field
    [self.lastName becomeFirstResponder];

    //scroll    
    id cellContainingFirstResponder = textField.superview.superview ;
    NSIndexPath *currentRowIndexPath = [self.signUpTable indexPathForCell:cellContainingFirstResponder];
    NSIndexPath *nextRowIndexPath = [NSIndexPath indexPathForRow:currentRowIndexPath.row+1 inSection:currentRowIndexPath.section];
    [self.signUpTable scrollToRowAtIndexPath:nextRowIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

if ([textField isEqual:self.lastName]){
    //Move cursor to next field
    [self.emailId becomeFirstResponder];

    //scroll
    id cellContainingFirstResponder = textField.superview.superview ;
    NSIndexPath *currentRowIndexPath = [self.signUpTable indexPathForCell:cellContainingFirstResponder];
    NSIndexPath *nextRowIndexPath = [NSIndexPath indexPathForRow:currentRowIndexPath.row+1 inSection:currentRowIndexPath.section];
    [self.signUpTable scrollToRowAtIndexPath:nextRowIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

if ([textField isEqual:self.emailId]){

    //Move cursor to next field
    [self.phoneNumber becomeFirstResponder];

    //scroll
    id cellContainingFirstResponder = textField.superview.superview ;
    NSIndexPath *currentRowIndexPath = [self.signUpTable indexPathForCell:cellContainingFirstResponder];
    NSIndexPath *nextRowIndexPath = [NSIndexPath indexPathForRow:currentRowIndexPath.row+1 inSection:currentRowIndexPath.section];
    [self.signUpTable scrollToRowAtIndexPath:nextRowIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

if ([textField isEqual:self.phoneNumber]){

    //Move cursor to next field
    [self.password becomeFirstResponder];

    //scroll
    id cellContainingFirstResponder = textField.superview.superview ;
    NSIndexPath *currentRowIndexPath = [self.signUpTable indexPathForCell:cellContainingFirstResponder];
    NSIndexPath *nextRowIndexPath = [NSIndexPath indexPathForRow:currentRowIndexPath.row+1 inSection:currentRowIndexPath.section];
    [self.signUpTable scrollToRowAtIndexPath:nextRowIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

}

// This is the last field hence dismiss keyboard -> This part is working
if ([textField isEqual:self.password]){
    [textField resignFirstResponder];

}

return YES ;

}
4

4 回答 4

7

要根据文本字段的焦点向上滚动表格视图,请尝试以下操作:

- (void) textFieldDidBeginEditing:(UITextField *)textField {
    UITableViewCell *cell = (UITableViewCell*) [[textField superview] superview];
    [yourTableView scrollToRowAtIndexPath:[yourTableView indexPathForCell:cell] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];   
}

在这里,您可以使用将滚动位置设置为顶部UITableViewScrollPositionTop

您可能想知道为什么要使用两个超级视图textfield。一个是 for UITableViewCellContentView,另一个是 for,UITableViewCell以便您可以获取表格的当前/焦点单元格的实例。

它有效,我们已经在我们的一个项目中使用了它

于 2013-07-18T06:21:58.700 回答
2

我使用 viewcontroller 作为表视图的数据源。我的解决方案:

  1. 将 UITextField 作为自定义 UITableViewCell 的公共属性。
  2. 在 cellForRowAtIndexPath 中,将目标添加到 UIControlEventEditingDidBegin 控件事件的文本字段:

    [((YourCustomCell *) cell).textfield addTarget:self action:@selector(textFieldDidBeginEditing:) forControlEvents:UIControlEventEditingDidBegin];
    
  3. 实现命名方法:找到文本字段的单元格并滚动到该单元格

    - (void)textFieldDidBeginEditing:(UITextField *)textField{
        for ( NSIndexPath *ip in [self.tableview indexPathsForVisibleRows] ){
            UITableViewCell * cell = [self.tableview cellForRowAtIndexPath:ip];
            if  ( [cell isKindOfClass:[YourCustomCell class]]){
    
                if ( [textField isEqual:((YourCustomCell *)cell).textfield] ){
                    [self.tableview selectRowAtIndexPath:ip animated:YES scrollPosition:UITableViewScrollPositionTop];
                    [self setContinueButtonEnabled:YES];
                }
            }
        }
    }
    
于 2014-03-28T17:22:11.880 回答
1

尝试使用此代码它可以帮助你

  CGPoint pt;
    CGRect rc = [textField bounds];
    rc = [textField convertRect:rc toView:scrView];
    pt = rc.origin;
    pt.x = 0;
    pt.y =0;
    [scrView setContentOffset:pt animated:YES];
于 2013-07-18T05:34:49.867 回答
1

您使用TKKeyboardAvoidingTableview 因此无需手动滚动表格视图,当光标点击时它会自动滚动

您在选择表视图中设置 xib 并像这样设置自定义类

在此处输入图像描述

于 2013-07-18T05:34:33.623 回答