我正在创建一个UIView扩展,如果UIView的特定实例确实是UITableViewCell的子视图,则返回可能的UITableViewCell。
我的想法是稍后我可以将UITableViewCell引用传递给UITableView的indexPath(for :)方法来获取单元格的索引路径。
因此,如果我的表视图单元格包含UITextField,那么当调用UITextFieldDelegate的textFieldDidEndEditing(_ textField:UITextField)方法时,我能够识别文本字段来自哪个单元格。
到目前为止,这是我想出的:
extension UIView {
var tableViewCell: UITableViewCell? {
get {
var view = self
while let superview = view.superview {
if let tableViewCell = superview as? UITableViewCell {
return tableViewCell
}
view = superview
}
return nil
}
}
}
我有两个问题:
由于我是使用Swift编程的新手,我可以知道是否有更好的(Swiftier?)方式来编写它吗?
这是识别包含正在编辑的UITextField的UITableViewCell的索引路径的好方法吗?有更好的方法吗?
我实际上对Swift和Stack Overflow都很新,所以如果我做错了(请原谅),我很抱歉,我希望得到你的指导。谢谢。
答案 0 :(得分:2)
最简洁的方法是将单元格标记为textField。
例如,您也可以使用indexPath.row
进行标记。
然后在UITextFieldDelegate
方法textFieldDidBeginEditing(_:)中,只需检查text {begins editing
的标记,您就可以从中创建一个NSIndexPath。
但是,如果在不同的secitons中有多个section和UITextFields,则NSIndexPath的section和row都需要正确。
根据tableView中有多少个textField,解决方案可能是创建一个NSDictionary来保持对section和row的引用。
答案 1 :(得分:1)
这是一种有趣的方法来计算indexPath,但更安全的方法可能是使用textView的委托方法并找出tableViewCell相对于tableView的indexPath。
class TableViewCell: UITableViewCell {
@IBOutlet weak var textField: UITextField!
}
class ViewController: UIViewController {
var indexPath: IndexPath?
@IBOutlet weak var tableView: UITableView!
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? TableViewCell else { return UITableViewCell() }
cell.textField.delegate = self
return cell
}
}
extension ViewController: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
let point = textField.convert(.zero, to: tableView)
indexPath = tableView.indexPathForRow(at: point)
}
}
答案 2 :(得分:0)
这些是替代方案:
1.根据点找到单元格。
func textFieldDidEndEditing(_ sender: UITextField) {
let tableViewTouchPoint:CGPoint = sender.convert(CGPointZero, to:self.tableView)
let indexPath = self.tableView.indexPathForRow(at: tableViewTouchPoint)
}
通过
创建Tableview的扩展名extension UITableView {
func indexPathForView(_ view: UIView) -> IndexPath? {
let tableViewTouchPoint:CGPoint = view.convert(CGPointZero, to:self)
let indexPath = self.indexPathForRow(at: tableViewTouchPoint)
return indexPath
}
}
使用它
let indexPath = self.tableView.indexPathForView(textField)
基于子视图标记。在CellForRowATIndex中,将标记设置为等于indexPath.row的视图。然后,要返回IndexPath使用:
让index = sender.tag
让indePath = IndexPath(row:index,section:0)