如何将UITextView嵌入具有委托的自定义单元格的UITableViewCell中?

时间:2019-02-21 10:44:45

标签: ios swift uitableview uitextview uitextviewdelegate

我有一个带有两个自定义单元格的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中的内存对象。如果有人有任何想法或指导,将不胜感激!

谢谢。

4 个答案:

答案 0 :(得分:1)

首先,您不需要textChanged 方法

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


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

在闭包内部声明,当文本视图确实发生更改时,将使用闭包的String参数为某些项目的属性(来自表视图数据源数组)分配属性,如果需要,请为此{{ 1}}

IndexPath

答案 1 :(得分:0)

cellForRowAt内部做

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

并在vc中实现委托方法

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

protocol CellDelegate {
  func textViewChanged(textView : UITextView)
}

在您的DetailTextTableViewCell

中添加一个委托var
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) {

    }