Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中获取文本字段的索引XPath_Ios_Swift_Uitableview_Uitextfield - Fatal编程技术网

Ios 如何在Swift中获取文本字段的索引XPath

Ios 如何在Swift中获取文本字段的索引XPath,ios,swift,uitableview,uitextfield,Ios,Swift,Uitableview,Uitextfield,我在我的应用程序中使用了一个分区的tableView,tableView的每一行都包含一个textField,当TextFieldDiBeginEdit开始编辑时,我需要知道该textField的indexPath。使用标记只能获取节或行,并且创建UITextField的扩展不允许添加变量。我怎样才能做到这一点?在cellForRow 将textFields的标记设置为索引 在文本字段中,开始编辑 有办法做到这一点,但它的设计很糟糕,建议您将textfield委托放在cell类中 您可以尝试使用

我在我的应用程序中使用了一个分区的tableView,tableView的每一行都包含一个textField,当TextFieldDiBeginEdit开始编辑时,我需要知道该textField的indexPath。使用标记只能获取节或行,并且创建UITextField的扩展不允许添加变量。我怎样才能做到这一点?

在cellForRow

将textFields的标记设置为索引

在文本字段中,开始编辑


有办法做到这一点,但它的设计很糟糕,建议您将textfield委托放在cell类中

您可以尝试使用textField.superview获取确切的单元格/内容视图,将其转换为MyTableViewCell,然后使用tableView.indexPathfor:cell获取索引

不需要标签来做这件事

例如:

var view: UIView = textField
while !view.isKind(of: UITableViewCell.self), let superView = view.superview {
    view = superView
}
if let view = view as? MyTableViewCell {
   //Do sth
}

我喜欢从文本字段走到单元格,询问表视图的索引路径

extension UIResponder {
    func next<T:UIResponder>(ofType: T.Type) -> T? {
        let r = self.next
        if let r = r as? T ?? r?.next(ofType: T.self) {
            return r
        } else {
            return nil
        }
    }
}

获取包含textfield的单元格的indexPath的最简单方法

func getIndexPathFromView(_ sender : UIView) -> IndexPath? {
    let point = sender.convert(CGPoint.zero, to: self.tblView)
    let indexPath = self.tblView.indexPathForRow(at: point)
    return indexPath
}

如果UITableView单元格中有UITextFields,那么我认为当UITextField成为第一响应者时,应该触发didSelect:indexath存根。首先探索这个问题。如果这不起作用,请尝试使用闭包覆盖UITextField类,以便在成为第一响应者时执行。您可以将UITextField子类化并向其添加indexPath属性。下一个是否等同于superView的可能副本?我以前从未使用过它。@Tj3n它是响应程序链,包含视图层次结构。它不会按原样编译,因为视图隐式类型为UITextField。必须显式地将其键入UIView。
extension UIResponder {
    func next<T:UIResponder>(ofType: T.Type) -> T? {
        let r = self.next
        if let r = r as? T ?? r?.next(ofType: T.self) {
            return r
        } else {
            return nil
        }
    }
}
func textFieldDidBeginEditing(_ textField: UITextField) {
    if let cell = textField.next(ofType: MyCell.self) {
        if let ip = self.tableView.indexPath(for:cell) {
           // whatever
        }
    }
}
func getIndexPathFromView(_ sender : UIView) -> IndexPath? {
    let point = sender.convert(CGPoint.zero, to: self.tblView)
    let indexPath = self.tblView.indexPathForRow(at: point)
    return indexPath
}