如何使用作为委托的自定义单元格将 UITextView 嵌入到 UITableViewCell 中?
How to embed UITextView inside UITableViewCell with custom cell that's the delegate?
我有一个带有两个自定义单元格的 UITableViewController - 一个包含一个 UITextField(供用户输入标题),另一个包含一个 UITextView(供用户输入描述)。每当这些发生变化时,我想更新我的记忆object(这是一个有两个变量的结构——memoryTitle 和 memoryDescription)。
memoryTitle 看起来很简单 - 在我的 ViewController 上我有以下内容:
@IBAction func memoryTitleChanged(_ sender: UITextField) {
memory.memoryTitle = sender.text ?? ""
}
虽然 UITextView 让我有点困惑。我遇到了两个问题 - 我无法以与 UITextField 相同的方式创建操作,所以我的下一个想法是让 ViewController 成为委托并使用 textViewDidChange 更新 memory.memoryDescription但这让我想到了第二个问题。
为了使 UITextView 单元格动态调整大小,我使用了以下非常有效的教程 (https://medium.com/@georgetsifrikas/embedding-uitextview-inside-uitableviewcell-9a28794daf01) 来制作我的自定义单元格:
class DetailTextTableViewCell: UITableViewCell, UITextViewDelegate {
//Found below method for resizing UITextView and cell - https://medium.com/@georgetsifrikas/embedding-uitextview-inside-uitableviewcell-9a28794daf01
@IBOutlet weak var memoryDescriptionTextView: UITextView!
var textChanged: ((String) -> Void)?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
memoryDescriptionTextView.delegate = self
memoryDescriptionTextView.backgroundColor = UIColor.red
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
//Found below method for resizing UITextView and cell - https://medium.com/@georgetsifrikas/embedding-uitextview-inside-uitableviewcell-9a28794daf01
func textChanged(action: @escaping (String) -> Void) {
self.textChanged = action
}
func textViewDidChange(_ textView: UITextView) {
textChanged?(textView.text)
}
}
现在我坚持使用 DetailTextTableViewCell 作为 UITextView 的委托,所以我不确定如何让它在 ViewController 中更新我的记忆 object 当文本更改时。如果有人有任何想法或指导,我们将不胜感激!
提前致谢。
里面cellForRowAt
做
let cell = ///
cell.memoryDescriptionTextView.tag = indexPath.row
cell.memoryDescriptionTextView.delegate = self
并在 vc
中实现委托方法
尝试在 cellForRowAt
方法中启用文本视图的用户交互 属性。
cell.memoryDescriptionTextView.delegate = self
cell.memoryDescriptionTextView.isUserInteractionEnabled = true
首先,你不需要textChanged
方法
func textChanged(action: @escaping (String) -> Void) {
然后,您需要的是在控制器的 cellForRowAt
中为每个特定单元格分配 textChanged
闭包变量(顺便说一句,这是个好方法)。
闭包内部声明,当文本视图发生变化时,某些项目(来自 table 视图数据源数组)属性 将被分配闭包的 String
参数,如果您需要,然后为此 IndexPath
重新加载某个单元格
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
cell.textChanged = { text in
self.dataSourceArray[indexPath.row].stringProperty = text
// tableView.reloadRows(at: [indexPath], with: .none)
// if you want to reload row, move calling closure
// to `textViewDidEndEditing` instead
}
...
}
在您的单元格上方声明此协议 DetailTextTableViewCell
protocol CellDelegate {
func textViewChanged(textView : UITextView)
}
在您的 DetailTextTableViewCell
中添加一个委托变量
var delegate : CellDelegate?
在 tableView 行的单元格中,将自己分配给单元格 属性 的委托
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
cell.delegate = self
}
在你的 DetailTextTableViewCell
里面添加这一行 textViewDidChange
func textViewDidChange(_ textView: UITextView) {
textChanged?(textView.text)
delegate?.textViewChanged(textView)
}
现在在你的视图控制器中实现委托函数
func textViewChanged(textView: UITextView) {
}
我有一个带有两个自定义单元格的 UITableViewController - 一个包含一个 UITextField(供用户输入标题),另一个包含一个 UITextView(供用户输入描述)。每当这些发生变化时,我想更新我的记忆object(这是一个有两个变量的结构——memoryTitle 和 memoryDescription)。
memoryTitle 看起来很简单 - 在我的 ViewController 上我有以下内容:
@IBAction func memoryTitleChanged(_ sender: UITextField) {
memory.memoryTitle = sender.text ?? ""
}
虽然 UITextView 让我有点困惑。我遇到了两个问题 - 我无法以与 UITextField 相同的方式创建操作,所以我的下一个想法是让 ViewController 成为委托并使用 textViewDidChange 更新 memory.memoryDescription但这让我想到了第二个问题。
为了使 UITextView 单元格动态调整大小,我使用了以下非常有效的教程 (https://medium.com/@georgetsifrikas/embedding-uitextview-inside-uitableviewcell-9a28794daf01) 来制作我的自定义单元格:
class DetailTextTableViewCell: UITableViewCell, UITextViewDelegate {
//Found below method for resizing UITextView and cell - https://medium.com/@georgetsifrikas/embedding-uitextview-inside-uitableviewcell-9a28794daf01
@IBOutlet weak var memoryDescriptionTextView: UITextView!
var textChanged: ((String) -> Void)?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
memoryDescriptionTextView.delegate = self
memoryDescriptionTextView.backgroundColor = UIColor.red
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
//Found below method for resizing UITextView and cell - https://medium.com/@georgetsifrikas/embedding-uitextview-inside-uitableviewcell-9a28794daf01
func textChanged(action: @escaping (String) -> Void) {
self.textChanged = action
}
func textViewDidChange(_ textView: UITextView) {
textChanged?(textView.text)
}
}
现在我坚持使用 DetailTextTableViewCell 作为 UITextView 的委托,所以我不确定如何让它在 ViewController 中更新我的记忆 object 当文本更改时。如果有人有任何想法或指导,我们将不胜感激!
提前致谢。
里面cellForRowAt
做
let cell = ///
cell.memoryDescriptionTextView.tag = indexPath.row
cell.memoryDescriptionTextView.delegate = self
并在 vc
中实现委托方法尝试在 cellForRowAt
方法中启用文本视图的用户交互 属性。
cell.memoryDescriptionTextView.delegate = self
cell.memoryDescriptionTextView.isUserInteractionEnabled = true
首先,你不需要textChanged
方法
func textChanged(action: @escaping (String) -> Void) {
然后,您需要的是在控制器的 cellForRowAt
中为每个特定单元格分配 textChanged
闭包变量(顺便说一句,这是个好方法)。
闭包内部声明,当文本视图发生变化时,某些项目(来自 table 视图数据源数组)属性 将被分配闭包的 String
参数,如果您需要,然后为此 IndexPath
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
cell.textChanged = { text in
self.dataSourceArray[indexPath.row].stringProperty = text
// tableView.reloadRows(at: [indexPath], with: .none)
// if you want to reload row, move calling closure
// to `textViewDidEndEditing` instead
}
...
}
在您的单元格上方声明此协议 DetailTextTableViewCell
protocol CellDelegate {
func textViewChanged(textView : UITextView)
}
在您的 DetailTextTableViewCell
var delegate : CellDelegate?
在 tableView 行的单元格中,将自己分配给单元格 属性 的委托
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
cell.delegate = self
}
在你的 DetailTextTableViewCell
里面添加这一行 textViewDidChange
func textViewDidChange(_ textView: UITextView) {
textChanged?(textView.text)
delegate?.textViewChanged(textView)
}
现在在你的视图控制器中实现委托函数
func textViewChanged(textView: UITextView) {
}