如何在 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()
}
我有一个 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()
}