在重复使用的单元格内导航文本字段

时间:2013-02-22 15:22:46

标签: iphone ios objective-c xcode ipad

我试图让用户能够使用箭头键遍历表格视图中的所有文本字段(每个单元格两个文本字段)。

目前我正在做的是为每个文本字段设置标记,并将每个文本字段添加到数组中。一旦用户单击文本字段开始编辑它,就会出现一些箭头按钮,当他们按下箭头键时,我抓住当前所选文本字段的标记,将其用作数组的位置,拉出文本字段想转到,并将新文本字段设置为第一响应者。

然而,问题在于我的细胞被重复使用。因此,如果用户在屏幕外滚动单元格,当它返回时,表格的第1行中的单元格可能具有带有标签15和16的文本字段,并且那些是文本字段数组的末尾,从而破坏了我的箭头键。滚动越多,文本字段就越乱。

是否有可能在保持可重复使用的细胞的同时完成我想要做的事情?或者这只是要求我不再使用它们?

这是我的箭头代码......

- (void)arrowPressedHandler:(UIButton *)button
{
UITextField *newTextFieldSelection;

//tags are offset by 2 because I have use tag 1 for something else, and tag 0 cannot be used
int realLocation = selectedTextField.tag - 2; 

//arrow code.  for an up button i go back 2 slots in the array, right is + 1 in array
//etc etc 
@try{
    switch (button.tag) {
        case NumericKeyboardViewUpArrow:
            newTextFieldSelection = [textFields objectAtIndex:realLocation - 2];
            [newTextFieldSelection becomeFirstResponder];
            break;
        case NumericKeyboardViewLeftArrow:
            newTextFieldSelection = [textFields objectAtIndex:realLocation - 1];
            [newTextFieldSelection becomeFirstResponder];
            break;
        case NumericKeyboardViewRightArrow:
            newTextFieldSelection = [textFields objectAtIndex:realLocation +1];
            [newTextFieldSelection becomeFirstResponder];
            break;
        case NumericKeyboardViewDownArrow:
            newTextFieldSelection = [textFields objectAtIndex:realLocation + 2];
            [newTextFieldSelection becomeFirstResponder];
            break;
        default:
            break;
    }
}
@catch (NSException *e)
{
    return;
}
}

1 个答案:

答案 0 :(得分:0)

我会采取略微不同的方法。

不是给出textField的所有不同标签,而是给它们一个在每行中唯一但在行之间相同的标签。即左边的一个获得标记1000,右边的一个获得1001.然后,使用单元格的indexPath获取相应的行。您的arrowPressedHandler:方法看起来像这样(在伪代码中):

- (void)arrowPressedHandler:(UIButton *)button
{
    NSIndexPath *selectedIndexPath = indexPathOfSelectedTextfield;
    UITextField *newTextFieldSelection;
    NSIndexPath *newIndexPath;
    NSUInteger newTag = 0;

    @try{
        switch (button.tag) {
            case NumericKeyboardViewUpArrow:
                // Move back two textFields (which would be the one directly above this one)
                newIndexPath = selectedIndexPath - 1;
                newTag = selectedTextField.tag;
                break;
            case NumericKeyboardViewLeftArrow:
                // Move back one textField.
                if (selectedTextField.tag == 1000) {
                    // Selected text field is on left.  Select right textfield in the row above
                    newIndexPath = selectedIndexPath - 1;
                    newTag = 1001;
                } else {
                    // Selected text field is on right.  Select the left textfield in the same row
                    newIndexPath = selectedIndexPath;
                    newTag = 1000;
                }
                break;
            // etc.
        }
        [self.tableview scrollToRowAtIndexPath:newIndexPath];
        newTextFieldSelection = [[self.tableview cellForRowAtIndexPath:newIndexPath] viewWithTag:newTag];
        [newTextFieldSelection becomeFirstResponder];

    }
    @catch (NSException *e)
    {
        return;
    }

}