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

时间:2018-11-07 19:41:37

标签: swift textview tableview

我有一个tableView带有带有多个TextViews的动态单元格。我正在关闭带有“取消”的键盘,并试图确定正在关闭哪个TextView来“撤消”用户所做的更改。

基于类似的问题:How to determine which textfield is active swift,我对以下扩展名采用了答案之一:

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

这正在工作,我目前正在以下代码中进行测试:

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

在打印时休息一下(“查看找到的”)我可以检查“测试”。结果如下。

enter image description here

这似乎仅通过内存地址标识视图“测试”。我的问题是如何解释这一点,以识别正在编辑的视图?

更新:在理解上似乎存在一些问题。假设我有一个包含两个单元格的表,每个单元格中有两个textViews(动态单元格)。通过在4个textViews中说来假定表加载。 “嗨约翰”,“嗨萨姆”,“再见约翰”,“再见萨姆”。假设用户开始编辑一个单元格并将一个单元格更改为“ Nachos”。然后,用户决定取消。然后,我想替换为之前的值(来自我的模型)。我可以找到textView,但现在显示为“ Nachos”。因此,我不知道要用适当的Hi和Bye重新加载哪个textView。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我确实通过将.tag属性添加到textView对象来解决此问题。我还删除了扩展方法,并使用了textView委托。该解决方案要求我首先为tableView中的每个textView分配标签并委托= 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类中定义了两个全局变量:

   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()
}