我有一个带有几个UITableViewCell的UITableView,这些单元格里面是UITextFields。我实现了一个UIToolbar,用于在不同的文本字段之间切换。我可以转到下一个单元格中的下一个文本字段或前一个文本字段。这样可以正常工作,直到一个单元格成为第一响应者,这在当前在tableview中是不可见的。
我想出了
[self.tableview cellForRowAtIndexPath:indexPath]
返回nil
,并且手动滚动到包含textfield的单元格(应该成为第一响应者)可以解决问题。因此,我尝试滚动到单元格,然后将其更改为第一响应者。
我用
尝试过[[self.tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
但遗憾的是,tableview不会滚动到此单元格,而是滚动到所有其他单元格。当我向此行添加断点时,不会发生问题。它看起来像tableview滚动到单元格,但然后再次向下滚动。
这是cellForRowAtIndexPath的代码:
UITableViewCell *cell;
static NSString *AttributeCellIdentifier = @"AttributeCellIdentifier";
cell = [tableView dequeueReusableCellWithIdentifier:AttributeCellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"AttributeCell" owner:self options:nil];
cell = attributeCell;
self.attributeCell = nil;
UITextField * textField = (UITextField *)[cell viewWithTag:1];
[textField setKeyboardType:UIKeyboardTypeDecimalPad];
[textField setInputAccessoryView:[self inputAccessoryView]];
}
UITextField * textField;
textField = (UITextField *)[cell viewWithTag:1];
textField.placeholder = @"C(Probe)/mol/l";
return cell;
以下是切换到上一个文本字段的代码:
UIView * currentResponder = [self.view findFirstResonder];
UITextField * newFocusTextField;
UITableViewCell * cell = (UITableViewCell*)[[currentResponder superview] superview];
NSIndexPath* indexPath = [self.tableView indexPathForCell:cell];
newFocusTextField = (UITextField*)[[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]] viewWithTag:1];
[currentResponder resignFirstResponder];
[newFocusTextField becomeFirstResponder];
UITableViewCell * newCell = (UITableViewCell*)[[newFocusTextField superview] superview];
NSIndexPath * newIndexPath = [self.tableView indexPathForCell:newCell];
[self.tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
希望这有帮助。
答案 0 :(得分:2)
您的帖子上的代码和问题定义并不是百分百清晰,但是滚动方法中存在一个错误/故障'适用于iOS 3.0(我想特别是3.0,据我记得)。我无法弄清楚它发生的原因,但它一直在崩溃,虽然它适用于iOS 4.x.
修复程序正在添加
[table reloadData]
滚动线前的。我知道它没有意义,我知道这不是好的做法,特别是如果细胞渲染很昂贵,但它确实解决了这种情况的问题。我不知道你的问题是否源自同一个问题,但你可能只是试一试......
答案 1 :(得分:1)
我尝试了几次思考,现在一切正常。我删除了:
[currentResponder resignFirstResponder];
删除该行后,tableview滚动正常,我可以使用newFocusTextField直接设置指向新单元格的指针,并将其设为firstResponder:
[newFocusTextField becomeFirstResponder];
我有一个nextTextField方法可以正常使用
[currentResponder resignFirstResponder];
所以我真的不明白为什么会出现这个问题,但我想滚动到单元格,然后设置新的firstResponder比首先重新调整currentResponder更好。
无论如何,谢谢你的帮助;)