在UITableViewCell中获取UITextField行

时间:2013-10-16 12:43:49

标签: ios uitableview uitextfield

我在UITextFields的自定义单元格中有两个UITableView。 我需要编辑和存储textFields的值。 当我在UITextField内部单击时,我必须知道它所属的行,以便将值保存到本地数组的正确记录中。 如何获取textField的行索引? 我试过了:

-(void)textFieldDidBeginEditing:(UITextField *)textField
{

     currentRow = [self.tableView indexPathForSelectedRow].row;


}

但当我点击UITextFieldRow内部时,currentRow不会改变。仅当我点击(选择)整行时才会改变...

5 个答案:

答案 0 :(得分:7)

文本字段未向表视图发送触摸事件,因此indexPathForSelectedRow无效。您可以使用:

CGPoint textFieldOrigin = [self.tableView convertPoint:textField.bounds.origin fromView:textField];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:textFieldOrigin]; 

答案 1 :(得分:5)

试试这个

//For ios 7

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


//For ios 6

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

答案 2 :(得分:5)

在iOS 8中,我发现模拟器和设备具有不同数量的超级视图,因此这更加通用,应该适用于所有版本的iOS:

UIView *superview = textField.superview;
while (![superview isMemberOfClass:[UITableViewCell class]]) { // If you have a custom class change it here
    superview = superview.superview;
}

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

答案 3 :(得分:0)

1>您可以通过在CellForRowAtIndexPath中以编程方式创建文本字段并将文本字段的标记设置为indexpath.row来实现它。 然后textFieldDidBeginEditing你可以只获取textField.tag并实现你想要的。

2>另一种方法是在一个表视图中有2个自定义单元格。通过这种方式,您可以单独放置文本字段并从实用工具面板设置其标记。

答案 4 :(得分:0)

我所做的是创建一个自定义单元格,并将我需要的任何自定义UI元素放入其中,并创建一个属性indexPath,该单元格在单元格出列时设置。然后我将indexPath传递给didSet中的自定义元素。

class EditableTableViewCell: UITableViewCell {

    @IBOutlet weak var textField: TableViewTextField!

    var indexPath: IndexPath? {
       didSet {
           //pass it along to the custom textField
           textField.indexPath = indexPath
        }
    }
}


class TableViewTextField: UITextField {
     var indexPath: IndexPath?
}

TableView

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "EditableCell") as! EditableTableViewCell
        cell.indexPath = indexPath
        return cell
}

然后我实现了UITextFieldDelegate协议,因为textField有它的indexPath,所以你总是知道它来自哪里。 不确定设置委托的最佳位置。最简单的方法是在细胞出列时进行设置。

override func textFieldDidEndEditing(_ textField: UITextField) {
    guard let myTextField = textField as? TableViewTextField else { fatalError() }
    guard let indexPath = myTextField.indexPath else { fatalError() }
 }