如何从其编辑的UITextField获取UITableViewCell的索引

时间:2011-04-20 15:01:19

标签: iphone uitableview uitextfield uitextfielddelegate

我正在研究基于iPhone的BI项目。

我在UITextField中有一个UITextViewCellUITextFieldDelegate指向UITableViewController,我没有为UITextViewCell做任何子类也不是UITextField

现在,在代理

上的文本字段结束编辑之后
  -(void)textFieldDidEndEditing:(UITextField*)textField

我需要知道我正在编辑的当前单元格的行索引,有没有办法获取文本字段的父单元格?或者我可以在创建单元格时将某些属性设置为文本字段,如'rowIndex'?我真的需要这个值以保存新文本。

谢谢。愿部队与你同在。

8 个答案:

答案 0 :(得分:9)

随着iOS 7中UITableViewCell类的更改,您必须有一种更加动态的方式来访问父单元格。您可以使用以下代码段进入UITextField的单元格(您应该将其放入textFieldDidEndEditing:委托方法中)

// Get the cell in which the textfield is embedded
id textFieldSuper = textField;
while (![textFieldSuper isKindOfClass:[UITableViewCell class]]) {
    textFieldSuper = [textFieldSuper superview];
}
// Get that cell's index path
NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)textFieldSuper];

该代码段适用于iOS 6和iOS 7。

答案 1 :(得分:8)

您要问的真正问题是,当用户将数据输入表格单元格的文本字段时,如何知道保存数据模型更改的位置。

@Ole Begemann建议使用tag属性是完全有效的。这取决于您的数据模型。如果您只需要一个整数来标识值在模型中的位置,那么将该整数存储在每个文本字段的tag属性中。由于您没有使用节,因此行索引等同于具有整个索引路径。

请注意,所有视图都有tag属性。因此,您可以将行索引存储在cell.contentView.tag中,将列索引存储在textField.tag中。在文本字段中,您可以使用textField.superview获取内容视图。如果不同的视图是textField的超级视图,则使用该视图。

如果您需要比这更复杂的东西来识别模型中的位置以保存文本字段内容,那么您将需要做一些不同的事情。我要么子类UITableViewCellUITextField,并在您在子类中定义的属性中存储所需的任何信息。

答案 2 :(得分:4)

如果您已将UITextField添加到UITableViewCell作为子视图, 因此,您可以从UITableViewCell UITextField's媒体资源中访问superview

尝试使用以下内容。

UITableViewCell* myCell = (UITableViewCell*)textField.superview ;

让我知道你遇到的任何问题。

<强>编辑:

您将获得UITextField所以

的tag属性中的行
NSUInteger  myRow = myTextField.tag;

正如您所说,您的应用程序不支持多个部分,这意味着您的所有行都在0部分。

NSUInteger  mySection = 0;

现在根据以上信息构建NSIndexPath实例。

NSIndexPath *myIndexPath =[NSIndexPath indexPathForRow:myRow  inSection:mySection]; //Do'nt release myIndexPath instance.

UITableViewCell* myCell = [myTableView cellForRowAtIndexPath:myIndexPath];

现在,你的 UITableView 中有myCell myRow

答案 3 :(得分:3)

对于iOS 7,它有点不同。 如果aTextField是一种类型的对象:UITextField iOS 6: [[aTextField superView] superView]

iOS 7: [[[aTextField superView] superView] superView]

Apple在UItableViewCell及其contentView之间添加了一个ScrollView。

编辑:滚动视图在iOS 8中消失。

iOS 8: [[aTextField superView] superView]

答案 4 :(得分:2)

正如其他人所建议的那样,您可以通过访问文本字段的超级视图来获取当前单元格。从那里,您可以使用UITableView方法-indexPathForCell:轻松找到当前单元格的索引路径。

<强>更新

虽然我仍然认为以上是最简单和最好的方法,但它可能会导致大型表视图减速(如果-indexPathForCell:涉及线性搜索)。我只是阅读了另一个有趣的想法:将section和row表示为unsigned short,将它们打包成一个整数并将结果存储在视图的(文本字段)标记属性(source)中。

答案 5 :(得分:1)

当您在textfield.tag中返回单元格时,可以将tableView:cellForRowAtIndexPath:设置为行索引。

答案 6 :(得分:0)

请记住,如果你有一个很长的单元格表,由于UITableView框架的大小,这些单元格可能会被取消分配。

由于iOS重复使用单元格,如果您有多个相似的单元格,请尝试执行此操作:开始编辑a 单元格点击UITextField,向下滚动到另一个单元格,直到所选的UITextField不在视图中,现在看看-(void)textFieldDidEndEditing:(UITextField*)textField方法中发生了什么。 您会注意到textFiled.superview是一个NULL指针,因为该单元格已被释放,您无法再访问它。

我想到的唯一解决方案是通过-(void)textFieldDidBeginEditing:(UITextField*)textField方法将您需要的单元格属性存储在属性中。

答案 7 :(得分:0)

实际上无需担心当前要编辑的单元索引。我正在使用此代码

UIView *tableViewCellView = [[field superview] superview];
if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
     // Need to traverse one step more up the visual tree
     tableViewCellView = [tableViewCellView superview];
}
[self.tableView scrollRectToVisible:[tableViewCellView frame] animated:YES];

与BSKeyboardControls委托方法一起成功将所选字段滚动到视图中。使用ios5及以上版本进行测试