如何在 TableView 中检测被解雇的 TextView?

How to detect dismissed TextView in TableView?

我有一个 tableView,其中包含带有多个 TextView 的动态单元格。我正在关闭带有 "Cancel" 的键盘,并试图确定哪个 TextView 被关闭以 "undo" 用户所做的更改。

基于这个类似的问题: 我为以下扩展改编了其中一个答案:

extension UIView {
var textViewsInView: [UITextView] {
    return subviews
        .filter ({ !([=10=] is UITextView) })
        .reduce (( subviews.compactMap { [=10=] as? UITextView }), { summ, current in
            return summ + current.textViewsInView
        })
}
var selectedTextView: UITextView? {
    return textViewsInView.filter { [=10=].isFirstResponder }.first
}
}

这是有效的,我目前正在测试以下代码:

   @objc func cancelButtonAction() {
    if let test =  tableView.selectedTextView {
        print("View Found")
    }
    tableView.beginUpdates()
    tableView.endUpdates()
}

打印时休息一下("View Found") 我可以检查 "test"。以下是结果。

这似乎只能通过内存地址来识别视图测试。我的问题是如何解释它以识别正在编辑的视图?

更新:好像理解有问题。假设我有一个包含两个单元格的 table,每个单元格中有两个 textView(动态单元格)。假设在 4 个文本视图中说 table 加载。 "Hi John"、"Hi Sam"、"Bye John"、"Bye Sam"。假设用户开始编辑一个单元格并将一个单元格更改为 "Nachos"。然后用户决定取消。然后我想替换为之前的值(来自我的模型)。我可以找到 textView,但它现在显示为 "Nachos"。因此我不知道要用适当的 Hi 和 Bye 重新加载哪个 textView。

为您的文本视图实现一个占位符,以便当它们的文本为空时,它将具有默认值。因此,当用户在 textview 的焦点上按下取消时,我们可以将 textview 的文本设置为其默认值。请参阅 link 以实现文本视图占位符。Text View Placeholder Swift

我确实通过向 textView 对象添加 .tag 属性 解决了这个问题。我还放弃了扩展方法并使用了 textView 委托。该解决方案要求我首先为 tableView 中的每个 textView 分配标签和 delegate = self:cellForRowAt。下面显示了多个 TextView 中的一个。请注意标签已设置,因此我可以确定它来自的部分和行以及特定项目。

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
...
  cell.directionsTextView.delegate = self
  cell.directionsTextView.tag = indexPath.section*1000 + indexPath.row+1
  return cell 
 }

我的tableView中定义了两个全局变量class:

   var activeTextView = UITextView()
   var activeTextViewPresentText = String()

textViewDidBeginEditing 在用户开始编辑之前捕获 textView 文本的原始状态。

      // Assign the newly active textview to store original value and original text
func textViewDidBeginEditing(_ textView: UITextView) {
    print("textView.tag: \(textView.tag)")
    self.activeTextView = textView
    self.activeTextViewPresentText = textView.text
}

最后,如果用户取消编辑,则重新加载原文。

  @objc func cancelButtonAction() {
    if  activeTextView.text != nil {
        activeTextView.text = activeTextViewPresentText
    }
    self.view.endEditing(true)
    tableUpdate()
}