我试图让用户能够使用箭头键遍历表格视图中的所有文本字段(每个单元格两个文本字段)。
目前我正在做的是为每个文本字段设置标记,并将每个文本字段添加到数组中。一旦用户单击文本字段开始编辑它,就会出现一些箭头按钮,当他们按下箭头键时,我抓住当前所选文本字段的标记,将其用作数组的位置,拉出文本字段想转到,并将新文本字段设置为第一响应者。
然而,问题在于我的细胞被重复使用。因此,如果用户在屏幕外滚动单元格,当它返回时,表格的第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;
}
}
答案 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;
}
}