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