【问题标题】:How to find which tableview is editing in textFieldDidEndEditing?如何在 textFieldDidEndEditing 中找到正在编辑的 tableview?
【发布时间】:2018-03-03 16:41:27
【问题描述】:

我正在使用 2 tableviews

tableviewcell 中都有textfiled

我在textFieldDidEndEditing 中获取文本字段的文本,但我怎么知道正在编辑的文本属于哪个表格视图,我只想知道我可以区分来自文本字段的文本以存储在两个不同数组中的条件。

func textFieldDidEndEditing(_ textField: UITextField)
{
  //  let indexOf = txtArray.index(of:textField.tag)

    if self.tblAnswer.isEditing
    {
        let indexOf = textField.tag

        if let text = textField.text
        {
            if allAnsText.indices.contains(indexOf)
            {
                allAnsText.remove(at: indexOf)
            }
            if text.isEmpty
            {
                print("Write some text there")
            }
            else
            {
            allAnsText.insert(text, at: indexOf)
            print(allAnsText)
            }
        }
    }
    else if self.tblVideo.isEditing
    {
        let indexOf = textField.tag

        if let text = textField.text
        {
            if allMediaText.indices.contains(indexOf)
            {
                allMediaText.remove(at: indexOf)
            }
            if text.isEmpty
            {
                print("Write some text there")
            }
            else
            {
                allMediaText.insert(text, at: indexOf)
                print(allMediaText)
            }
        }

    }

}

【问题讨论】:

  • 请展示一些您尝试过的代码。
  • 两个tableview的tableviewcell不同或相同
  • 你得到了什么 textField.superView.superView ?
  • @Anbu.Karthik 不同的tableviewcell
  • 如果您不想使用 superview,唯一的方法是修复 Tableview 1 和 tableview 2 的一些常量,假设 tableview 1 是 5000,tableview 2 是 6000,现在在单元格中为行给出像 5000 / 6000 + indexPath.row 这样的标签,textFieldDidEndEditing 方法检查标签 > 6000 它是 tableview 2

标签: ios swift uitableview


【解决方案1】:

忘记遍历视图层次结构;它很容易出错,并且确切的细节将来可能会发生变化(并严重破坏您的应用程序)。

原始答案(供后代使用)

试试这个:

  1. 获取文本字段在屏幕上的位置:

    // Center on text field's own coordinate system
    let position = textField.frame.center
    
    // Center on Window's coordinate system
    let positionOnWindow = textField.convert(position, to: nil)
    
  2. 将该点转换为表格视图的坐标系,并查看它是否对应于一行:

    let positionInTable = tableView1.convert(positionOnWindow, from: nil)</strike>
    
    if let indexPath = tableView1.indexPathForRow(at: positionInTable) {
        // Text field is inside a row of table view 1
    } else {
        // Otherwise
    }
    

注意:以上代码未经测试。可能包含编译器错误。

假设两个代码 sn-ps 在同一个类(您的表视图委托、数据源和文本字段委托)上运行,传递 positionOnWindow 的值应该没有问题(这都可能发生在文本字段委托内方法)。

更好的答案

正如@rmaddy 在 cmets 中适当指出的那样,上面的代码太迂回了;您可以通过以下方式直接获得职位:

let positionInTable = tableView1.convert(textField.frame.center, from: textField)

(无需往返窗口坐标系)

【讨论】:

  • 感谢您接受答复。如果你让它工作,请告诉我(我没有测试我的答案代码)。
  • 最后。感谢@Nicolas Miari(特别感谢)、@Pallavi Srikhakollu、@Salman Ghumsani、@Jon Snow 的努力
  • 这比需要的要复杂。只需:let positionInTable = tableView1.convert(textField.frame.center, from: textField).
  • @rmaddy 你是对的。我一到办公桌就会更新这个答案。
【解决方案2】:

Swift 3.x

假设您的 textFiled 层次结构是:

TextField->Cell->TableView

textFieldDidEndEditing中写这行代码

print(textField.superview?.superview)
if textField.superview?.superview == myTable1 {

}
else if textField.superview?.superview == myTable2 {

}
else {

}

【讨论】:

  • 为什么不用else if或者直接else,这里两个if没意义
  • 文本字段和单元格之间不是有单元格的内容视图吗? UITableViewUITableviewCell 的内部结构是实现细节,不是公共 API 的一部分。依赖该结构的代码非常脆弱。
  • 这不是正确的方法。这对单元格类和表格视图类的私有布局做出了错误的假设。
猜你喜欢
  • 1970-01-01
  • 2018-10-24
  • 2014-10-14
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多