UITableView scrollToRowAtIndexPath有时仅滚动

时间:2011-04-25 21:58:14

标签: iphone objective-c cocoa-touch uitableview

我有一个带有几个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];

希望这有帮助。

2 个答案:

答案 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更好。

无论如何,谢谢你的帮助;)