Ios 如何在UITableViewCell中嵌入UITextView,自定义单元格为';代表是谁?

Ios 如何在UITableViewCell中嵌入UITextView,自定义单元格为';代表是谁?,ios,swift,uitableview,uitextview,uitextviewdelegate,Ios,Swift,Uitableview,Uitextview,Uitextviewdelegate,我有一个带有两个自定义单元格的UITableViewController—一个包含UITextField(供用户输入标题),另一个包含UITextView(供用户输入说明)。每当这些更改发生时,我都希望更新我的内存对象(它是一个具有两个变量的结构—memoryTitle和memoryDescription) Memorytile似乎很简单-在我的ViewController上,我有以下功能: @IBAction func memoryTitleChanged(_ sender: UITextF

我有一个带有两个自定义单元格的UITableViewController—一个包含UITextField(供用户输入标题),另一个包含UITextView(供用户输入说明)。每当这些更改发生时,我都希望更新我的内存对象(它是一个具有两个变量的结构—memoryTitle和memoryDescription)

Memorytile似乎很简单-在我的ViewController上,我有以下功能:

 @IBAction func memoryTitleChanged(_ sender: UITextField) {
        memory.memoryTitle = sender.text ?? ""
    }
不过,UITextView让我有点困惑。我遇到了两个问题-我无法以与UITextField相同的方式创建操作,因此我的下一个想法是将ViewController设置为委托,并使用textViewDidChange更新memory.memoryDescription,但这带来了我的第二个问题

为了使UITextView单元格动态调整大小,我使用了以下教程,该教程非常有效(),使我的自定义单元格如下所示:

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中的内存对象。如果有人有任何想法或指导,我们将不胜感激


提前谢谢。

cellForRowAt
do内

let cell = /// 
cell.memoryDescriptionTextView.tag = indexPath.row
cell.memoryDescriptionTextView.delegate = self

并在vc中实现委托方法

尝试在
cellForRowAt
方法中启用文本视图的用户交互属性

cell.memoryDescriptionTextView.delegate = self
cell.memoryDescriptionTextView.isUserInteractionEnabled = true

首先,您不需要
textChanged
方法

func textChanged(操作:@escaping(String)->Void){


然后,您需要的是在控制器的
cellForRowAt
中为每个特定单元格分配
textChanged
闭包变量(这是一个很好的方法,顺便说一句)

在闭包内部声明,当文本视图发生更改时,某些项(来自表视图数据源数组)的属性将被分配闭包的
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)
}
var delegate : CellDelegate?
DetailTextTableViewCell

protocol CellDelegate {
  func textViewChanged(textView : UITextView)
}
var delegate : CellDelegate?
在tableView行的单元格中,将self分配给单元格的delegate属性

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) {

    }

从代码看,似乎有一个闭包
textChanged
,它将在文本更改时调用。所以我相信您将在cellForRow方法上为它赋值,类似于
cell.textChanged{}
。使用此闭包将值设置为
内存。memoryDescription
您好,@RobertDresler是否需要重新加载单元格?因为用户已经在UItextview中输入,并且已经可以显示输入的文本,那么为什么需要重新加载单元格?@AtulParmar哦,好的,没有必要。请不要这样做。如果他已经有了闭包变量,为什么要为此创建委托协议?