我有一个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()
}
在打印时休息一下(“查看找到的”)我可以检查“测试”。结果如下。
这似乎仅通过内存地址标识视图“测试”。我的问题是如何解释这一点,以识别正在编辑的视图?
更新:在理解上似乎存在一些问题。假设我有一个包含两个单元格的表,每个单元格中有两个textViews(动态单元格)。通过在4个textViews中说来假定表加载。 “嗨约翰”,“嗨萨姆”,“再见约翰”,“再见萨姆”。假设用户开始编辑一个单元格并将一个单元格更改为“ Nachos”。然后,用户决定取消。然后,我想替换为之前的值(来自我的模型)。我可以找到textView,但现在显示为“ Nachos”。因此,我不知道要用适当的Hi和Bye重新加载哪个textView。
答案 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()
}