获取UITableViewCell的UIView扩展名?

时间:2017-02-18 06:00:15

标签: ios swift uitableview uiview swift3

我正在创建一个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
        }
    }
}

我有两个问题:

  1. 由于我是使用Swift编程的新手,我可以知道是否有更好的(Swiftier?)方式来编写它吗?

  2. 这是识别包含正在编辑的UITextField的UITableViewCell的索引路径的好方法吗?有更好的方法吗?

  3. 我实际上对Swift和Stack Overflow都很新,所以如果我做错了(请原谅),我很抱歉,我希望得到你的指导。谢谢。

3 个答案:

答案 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) 
  1. 基于子视图标记。在CellForRowATIndex中,将标记设置为等于indexPath.row的视图。然后,要返回IndexPath使用:

    让index = sender.tag

    让indePath = IndexPath(row:index,section:0)