【问题标题】:How to get all custom tableview cell textField and textView value outside tableView如何获取 tableView 之外的所有自定义 tableview 单元格 textField 和 textView 值
【发布时间】:2019-05-12 07:41:28
【问题描述】:

我尝试像这样从 tableView 外部访问自定义 tableView 单元格文本字段:

for i in 0..<NameCounter {
let indexPath = IndexPath(row: i, section: 0)
guard let cell = sampleTableView.cellForRow(at: indexPath) as? sampleCellView else{
    return
}
if let text = cell.txtName.text, !text.isEmpty {
   let value = text
   print("Getting NameText : \(value)")
}

if let text = cell.txtNote.text, !text.isEmpty {
    let value = text
    print("Getting noteText : \(value)")
}}

但问题是上面的方法你只能得到 tableView 的可见单元格,除非单元格是 nil。而且因为我保护它以避免零单元格,所以我没有得到所有文本字段的值。

如果我像这样移除警卫:

let cell = sampleTableView.cellForRow(at: indexPath) as! sampleCellView

它会崩溃并得到一些单元格为 nil。

如何从 tableView 外部访问所有文本字段值并获取所有单元格(单元格可能不为零)?

我有多个 tableView,在每个 tableView 单元格中,我放置了 txtName 和 txtNote。我想检测哪个 txtName 和 txtNote 正在被编辑,所以我可以放入正确的模型。

注意:txtName 是 textfield,txtNote 是 textView

【问题讨论】:

  • 当然它会崩溃,因为如果你在屏幕上有前 10 个单元格,但有 50 个单元格 - [11...50] 范围内的单元格很可能为零。

标签: ios swift uitableview


【解决方案1】:

这个回报

let cell = sampleTableView.cellForRow(at: indexPath) as! sampleCellView

nil 并且由于表格单元格可重复使用而导致任何不可见的单元格崩溃,您需要将用户键入的每个单元格保存到模型(tableView dataSource 数组),然后从中获取值

var model = [String]()

// 在 cellForRowAt 内

    cell.textView.delegate = self

    cell.textView.tag = indexPath.row
}
@objc func textViewDidChange(_ tex: UITextView) {


    model[tex.tag] = tex.text!

}

类 VC:UIViewController,UITextViewDelegate {

【讨论】:

  • 如何保存用户为每个单元格输入的模型?使用 textFieldDidChange?
  • 你的意思是 var model = [String]()
  • 如果txtNote是一个textView,而不是一个textField呢?
  • 问题是我有多个tableView,每个tableView里面都有txtNote。如何检测正在编辑哪个 txtNote(来自哪个 tableView)?我找到了这个,但是这个 textView 不在 tableView 单元格内 (stackoverflow.com/questions/38625944/…)
  • 您之前关于 textField 的答案是正确的,我认为您可以将其保留在答案中,以便其他人也可以看到正确的答案。因为 txtName 是 textField 而 txtNote 是 textView。并且每个 tableView 都有每个 txtName 和 txtNote。而且我有多个 tableView。
【解决方案2】:

作为一种良好的标准做法,应该不需要从UITableViewCells 获取值。您应该根据需要根据一些逻辑从UITableView 中提供的模型中获取值。

此外,当需要访问在UITableViewCell 上键入的任何文本时,应首先在关联模型中更新它并从那里访问。

在幕后 UITableViewCell 被重复使用,如果您从 UITableView 访问它,只有当前可见的单元格才会显示实际数据。因此,可以选择将单元格的输入值保存到某个数组/字典中以供以后使用。

【讨论】:

  • 我认为 OP 正在询问如何更新该模型。
  • 实际情况是nil单元格有textfield文本且不为空
  • 如何像你写的@Rizwan 那样使用模型?
  • 您是否使用一些数组/字典在表格视图中显示其内容?如果没有,则在用户输入后创建一个数组并保存 UITableViewCell 的内容。然后从Array中访问对应的数据。
  • @RakeshaShastri - 更新答案,谢谢提醒。
【解决方案3】:

您不应依赖从单元格标签、文本字段等中获取的值。

一旦单元格离开屏幕 - 它会被扔到池中以供以后重用,甚至可能被释放。

您应该将view state 保留在某个数组中,然后您可以安全地在任何索引处获取任何值。

如果您有 1000 个细胞,那么任何时候可能只有 10-20 个可见,而可重复使用的细胞池中可能有 40-50 个左右。如果您位于索引路径第 100 行 - 显然索引路径第 150 行之后的单元格将是 nil

【讨论】:

  • 如果我使用 dequeueReusableCellWithIdentifier,我没有得到任何单元格文本字段值
  • dequeueReusableCellWithIdentifier 将为您提供一个单元格,但它可能包含来自先前显示的单元格的文本标签,然后您仍应使用模型中特定部分/行的数据对其进行配置,这可以很简单作为字典对象的数组。您不应该依赖从视图中获取数据,而是从模型中获取数据。
猜你喜欢
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多