6

我正在开发一个基于 iPhone 的 BI 项目。

我有一个UITextFieldin a UITextViewCellUITextFieldDelegate指向 my ,我没有为 the或 theUITableViewController做任何子分类。UITextViewCellUITextField

现在在代表上的文本字段结束编辑之后

  -(void)textFieldDidEndEditing:(UITextField*)textField

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

谢谢你。愿原力与你同在。

4

8 回答 8

9

随着UITableViewCelliOS 7 中类的变化,您必须有一种更动态的方式来访问父单元格。您可以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。

于 2013-09-24T11:55:47.233 回答
8

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

@Ole Begemann 使用该tag属性的建议是完全有效的。这取决于您的数据模型。如果您只需要一个整数来确定值在模型中的位置,则将该整数存储在tag每个文本字段的属性中。由于您没有使用部分,因此行索引相当于拥有整个索引路径。

请记住,所有视图都有一个tag属性。因此,您可以将行索引存储在 中cell.contentView.tag,将列索引存储在textField.tag. 从文本字段中,您可以使用textField.superview. 如果不同的视图是textField使用它的超级视图。

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

于 2011-04-20T18:16:59.290 回答
4

如果您已将您的UITextFieldin添加UITableViewCell为子视图,那么您可以UITableViewCell从您的UITextField's superview财产中访问。

试试下面。

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

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

编辑:

您将从UITextFieldSo的 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];

现在你有myCell哪个myRow在你的UITableView

于 2011-04-20T15:09:57.463 回答
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]

于 2013-10-23T03:57:38.503 回答
2

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

更新

虽然我仍然认为上述方法是最简单和最好的方法,但它可能会导致大型表视图变慢(如果 -indexPathForCell: 涉及线性搜索)。我刚刚读到另一个有趣的想法:将部分和行表示为无符号短裤,将它们打包成一个整数并将结果存储在视图的(文本字段)标签属性(source)中。

于 2011-04-20T19:05:29.967 回答
1

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

于 2011-04-20T15:03:05.617 回答
0

请记住,如果您有一个很长的单元格表,这些单元格可能会因为 UITableView 框架的大小而被释放。

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

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

于 2012-10-03T08:59:48.847 回答
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 及更高版本测试

于 2014-03-10T09:29:52.197 回答