【问题标题】:Get indexPath of UITextField in UITableViewCell with Swift使用 Swift 获取 UITableViewCell 中 UITextField 的 indexPath
【发布时间】:2014-07-27 04:51:58
【问题描述】:

所以,我正在构建一个详细视图控制器应用程序,它显示一个包含两部分单元格的表格:标签和文本字段。

我正在尝试检索文本字段值并将其添加到数组中。 我尝试使用“textField.superview.superview”技术,但没有成功。

func textFieldDidEndEditing(textField: UITextField!){
    var cell: UITableViewCell = textField.superview.superview
    var table: UITableView = cell.superview.superview
    let textFieldIndexPath = table.indexPathForCell(cell)
}

Xcode 构建失败并显示“UIView 不能转换为UITableViewCell”和“转换为UITableView”。 引用表有两个部分,分别为四行和两行。

提前致谢。

编辑: 在函数的第二行添加了“.superview”。

【问题讨论】:

  • 你试过铸造吗?尝试在 .superview.superview 行的末尾添加“as UITableViewCell”
  • iOS 7 更改了 UITableViewCell 层次结构,something.superview.superview 不再有效。你需要使用 [sender convertPoint:CGRectZero toView:self.tableView] 来获取根点,然后去 NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:rootPoint];当然,你需要使用 Swift 代码来做这件事,我不知道(这里只是展示算法而已)。

标签: ios uitableview swift


【解决方案1】:

虽然当前接受的答案可能有效,但它假定了一个特定的视图层次结构,这不是一种可靠的方法,因为它很容易发生变化。

要从单元格内的UITextField 中获取indexPath,最好使用以下方法:

func textFieldDidEndEditing(textField: UITextField!){
    let pointInTable = textField.convert(textField.bounds.origin, to: self.tableView)
    let textFieldIndexPath = self.tableView.indexPathForRow(at: pointInTable)
    ...
}

这将继续独立于视图层次结构的最终更改。

【讨论】:

    【解决方案2】:

    你可以使用UITableViewCelltag属性

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
            let cell = tableView.dequeueReusableCell(withIdentifier: "UpdateTableViewCell", for: indexPath) as! UpdateTableViewCell
    
            cell.tag = indexPath.row
            cell.setCellData()
    
            return cell
    }
    

    现在在UITableViewCell

    func textFieldDidEndEditing(textField: UITextField!){
        let textFieldIndexPath = self.tag
    }
    

    【讨论】:

    • 它总是给出0标签,如果你在整个表格视图中有一个textField并且不使用标签,它就会被应用。标签仅在按钮操作中有用。
    【解决方案3】:

    您需要在函数中强制转换第一行和第二行,如下所示:

    func textFieldDidEndEditing(textField: UITextField!){
        var cell: UITableViewCell = textField.superview.superview as UITableViewCell
        var table: UITableView = cell.superview as UITableView
        let textFieldIndexPath = table.indexPathForCell(cell)
    }
    

    superview 返回一个 UIView,因此您需要将其转换为您期望的视图类型。

    【讨论】:

    • 现在它可以正确构建,但是当模拟器运行“cell as UITableView”时,应用程序会崩溃。你猜怎么了?
    • 可能是因为cell的superview不是UITableView。您必须以不同的方式访问 tableview
    • 建议?我对这个世界真的很陌生;)
    • 有用。正是我想要的。
    【解决方案4】:

    使用 superview 和类型转换不是首选的方法。最佳实践是使用委托模式。如果您在 DemoTableViewCell 中有一个 textField,而您正在 DemoTableViewController 中使用,则创建一个协议 DemoTableViewCellDelegate 并将 DemoTableViewCell 的委托分配给 DemoTableViewController,以便在编辑结束时通知 viewcontroller。

    protocol DemoTableViewCellDelegate: class {
      func didEndEditing(onCell cell: DemoTableViewCell)
    }
    
    class DemoTableViewCell: UITableViewCell {
      @IBOutlet var textField: UITextField!
    
      weak var delegate: DemoTableViewCellDelegate?
    
      override func awakeFromNib() {
        super.awakeFromNib()
        textField.delegate = self
      }
    }
    
    extension DemoTableViewCell: UITextFieldDelegate {
      func textFieldDidEndEditing(_ textField: UITextField) {
        delegate.didEndEditing(onCell: self)
      }
    }
    
    class DemoTableViewController: UITableViewController {
    
      override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
        let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: DemoTableViewCell.self, for: indexPath)
        cell.delegate = self
        return cell
      }
    
    }
    
    extension DemoTableViewController: DemoTableViewCellDelegate {
      func didEndEditing(onCell cell: DemoTableViewCell) {
        //Indexpath for the cell in which editing have ended.
        //Now do whatever you want to do with the text and indexpath.
        let indexPath = tableView.indexPath(for: cell)
        let text = cell.textField.text
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-23
      • 2014-11-10
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      相关资源
      最近更新 更多