我在表格内的自定义单元格中有一个 UITextField。我创建了新类DataCell,它是 UITableViewCell 的子类。在 DataCell 中,我为文本字段创建了出口,并且在实现文件中也有使用“编辑结束”的方法,并在那里操作文本字段值。
我现在想知道如何获取单元格的 rowIndex 或编号,因为每次单击 + 按钮时都会在表格上加载新的自定义单元格。如果我得到标签,无论我选择什么单元格,我总是会得到相同的标签号。
我在表格内的自定义单元格中有一个 UITextField。我创建了新类DataCell,它是 UITableViewCell 的子类。在 DataCell 中,我为文本字段创建了出口,并且在实现文件中也有使用“编辑结束”的方法,并在那里操作文本字段值。
我现在想知道如何获取单元格的 rowIndex 或编号,因为每次单击 + 按钮时都会在表格上加载新的自定义单元格。如果我得到标签,无论我选择什么单元格,我总是会得到相同的标签号。
传递给您的委托的文本字段是单元格的子视图contentView
。
UITableViewCell *cell = (UITableViewCell*) textField.superview.superview;
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
当您不确定文本字段和单元格之间的层次结构时,可以使用此逻辑。
UITableViewCell *cell = nil;
UIView *parentView = textField.superview;
while(parentView) {
if([parentView isKindOfClass:[UITableViewCell class]]) {
cell = parentView;
break;
}
parentView = parentView.superview;
}
if(cell)
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
将标签添加到 tableView:cellForRowAtIndexPath: 方法中的文本字段。在此示例中,我有一个带有标签和文本字段的自定义单元格:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.label1.text = self.theData[indexPath.row];
cell.textField.tag = indexPath.row;
return cell;
}
听起来您可能正在处理自定义单元格类中的编辑结束,但您可能想考虑在表格视图控制器中进行,因为这使您可以轻松访问模型,我认为您正在修改模型用户在文本字段中键入。如果你这样做,那么你应该将文本字段的委托属性连接到 IB 中的表视图控制器。
如果我们接受脆弱的答案,那么为了对对话做出新的贡献:
CGRect rectInTableView =
[tableView convertRect:textField.bounds fromView:textField];
NSUInteger indexOfCellContainingTextField =
(NSUInteger)(rectInTableView.y / tableView.rowHeight);
使其脆弱的假设:(i)所有行的高度相同;(ii) 高度在表格视图上设置。如果您尚未实施UITableViewDelegate -tableView:heightForRowAtIndexPath:
,那么这两个假设都将成立。您还利用了将正浮点数转换为整数向下舍入的事实。
我会争辩说,尽管还没有完全清除假设,但这比 Mundi 的解决方案要脆弱,因为它只对您直接控制的事情(即单元格大小)做出假设,而不是对您不控制的事情(即视图层次结构)做出假设UIKit 在内部使用来呈现表格视图)。