如何从UITextField获取UITableViewCell的索引?

时间:2013-04-02 16:29:32

标签: ios objective-c xcode ios6

我在表格中的自定义单元格中有一个UITextField。我创建了新类 DataCell ,它是UITableViewCell的子类。在DataCell内部,我为textfields创建了出口,我在实现文件中也有方法,使用'editing did end'并在那里操作textField值。

我现在想知道如何获取rowIndex或单元格的数量,因为每次单击+按钮时,新的自定义单元格都会加载到表格中。如果我得到标签,无论我选择哪个单元格,我都会得到相同的标签号。

4 个答案:

答案 0 :(得分:11)

传递给您的委托的文本字段是单元格contentView的子视图。

UITableViewCell *cell = (UITableViewCell*) textField.superview.superview; 
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 

答案 1 :(得分:2)

当您不确定textfield和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]; 

答案 2 :(得分:1)

在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中的表视图控制器。

答案 3 :(得分:0)

如果我们接受脆弱的答案,那么为了给对话提供新的东西:

CGRect rectInTableView =
    [tableView convertRect:textField.bounds fromView:textField];

NSUInteger indexOfCellContainingTextField =
    (NSUInteger)(rectInTableView.y / tableView.rowHeight);

使其脆弱的假设:(i)所有行都是相同的高度; (ii)在桌子视图上设置高度。如果您尚未实施UITableViewDelegate -tableView:heightForRowAtIndexPath:,那么这两个假设都将成立。您还利用了将正浮点数转换为整数的事实。

我认为虽然仍然没有完全清楚假设,但这不像Mundi的解决方案那么脆弱,因为它只假设你直接控制的东西(即细胞大小),而不是你不做的事情(即,视图层次结构UIKit在内部使用它来呈现表视图。