如何在UITableViewCell中使用自定义单元格嵌入UITextView作为委托?

问题描述 投票:1回答:4

我有一个带有两个自定义单元格的UITableViewController - 一个包含一个UITextField(供用户输入标题),另一个包含一个UITextView(供用户输入描述)。每当这些改变时,我想更新我的内存对象(这是一个带有两个变量的结构 - memoryTitle和memoryDe​​scription)。

memoryTitle似乎很简单 - 在我的ViewController上我有以下内容:

 @IBAction func memoryTitleChanged(_ sender: UITextField) {
        memory.memoryTitle = sender.text ?? ""
    }

虽然UITextView让我感到困惑。我遇到了两个问题 - 我无法以相同的方式为UITextField创建一个动作,所以我的下一个想法是使ViewController成为委托并使用textViewDidChange更新memory.memoryDe​​scription但是这会带我到我的第二个问题。

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

先感谢您。

ios swift uitableview uitextview uitextviewdelegate
4个回答
0
投票

将此协议声明在您的单元格DetailTextTableViewCell上方

protocol CellDelegate {
  func textViewChanged(textView : UITextView)
}

DetailTextTableViewCell中添加委托变量

var delegate : CellDelegate?

在tableView行的单元格中,将self指定为委托单元格的属性

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

    }

1
投票

首先,您不需要textChanged方法

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


那么,你需要的是,在控制器的textChanged中为每个特定的单元格分配你的cellForRowAt闭包变量(这是一个很好的方法btw)。

内部闭包声明,当文本视图发生更改时,某些项目(来自表视图数据源数组)属性将被赋值为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
    }
    ...
}

0
投票

cellForRowAt里面做

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

并在vc中实现委托方法


0
投票

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

cell.memoryDescriptionTextView.delegate = self
cell.memoryDescriptionTextView.isUserInteractionEnabled = true
© www.soinside.com 2019 - 2024. All rights reserved.