4

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

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

     currentRow = [self.tableView indexPathForSelectedRow].row;


}

但是当我在 UITextFieldRow 内单击时,currentRow 不会改变。只有当我单击(选择)整行时才会改变......

4

5 回答 5

7

文本字段未将触摸事件发送到表格视图,因此 indexPathForSelectedRow 不起作用。您可以使用:

CGPoint textFieldOrigin = [self.tableView convertPoint:textField.bounds.origin fromView:textField];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:textFieldOrigin]; 
于 2014-03-13T16:27:42.477 回答
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];
于 2014-10-02T21:11:10.237 回答
4

尝试这个

//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];
于 2013-10-16T12:46:27.677 回答
0

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

2>另一种方法是在一个表格视图中有 2 个自定义单元格。这样,您可以单独放置文本字段并从实用程序面板设置它们的标签。

于 2013-10-16T12:48:11.527 回答
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() }
 }
于 2017-05-08T20:45:24.650 回答