TableViewController问题:无法保存来自textView的用户输入

时间:2018-12-13 14:52:15

标签: swift tableview

更新: 因此,这样做的目的是将用户输入的UITextView中的文本保存在单元格中,以便为该特定单元格号保存文本,并且不会重复,移动或删除该文本。

根据建议,我尝试通过执行以下操作来处理自定义单元格内的textViewdidChange函数:

var onTextEntered: ((String?) -> ())!

func setup() {
    notesTextView.delegate = self
}

func textViewDidChange(_ textView: UITextView) {
    onTextEntered(notesTextView.text)
}

制作一个包含文本的字符串,然后在每次调用textViewDidChange时将其添加到String中(尝试向自己解释这一点,因此,如果我的解释需要它,请更正我的意思。)

CellForRowAt中的下一个

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cellIdentifier = "TableViewNotesCell"

    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! TableViewNotesCell





    cell.setup()

    cell.onTextEntered = {input in

        if let text = input {

            self.cellText[indexPath.row] = text // here is the error (index out of range)

        }


        if indexPath.row < self.cellText.count {
            cell.notesTextView.text = self.cellText[indexPath.row] ?? "placeholder"
        }
    }

    return cell

}

当我执行上述代码时,一旦调用textViewDidChange(当我在textView中键入单个字母或数字时),我在使用的行上收到错误:“致命错误:索引超出范围” cellText [indexPath.row] =文本的数组。请帮助或让我知道如果我对过程的理解是错误的,将很乐意学习!

3 个答案:

答案 0 :(得分:0)

您可以尝试保存每个修改

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    // inside cellForRowAt

    cell.textView.delegate = self

    cell.textView.tag = indexPath.row

    return cell
}

@objc func textViewDidChange(_ tex: UITextView) { 

    cellEndEdit[tex.tag] = tex.text!

}

class VC:UIViewController,UITextViewDelegate {

为数组提供默认值

 var cellEndEdit = [String](repeating: "", count: numberOfRows)

答案 1 :(得分:0)

假定tableView的单元格数量可变,并且所有单元格都有一个UITextView,应记录其内容并为其建立索引,我建议创建一个自定义UITableViewCell来处理textView本身。

class CustomTableViewCell: UITableViewCell, UITextViewDelegate {

    @IBOutlet weak var textView: UITextView() 
    var onTextEntered: ((String?) -> ()) //that's a callback

    func setup() {
        textView.delegate = self
    }

    override func textViewDidChange(textView: UITextView) {
        onTextEntered(textView.text)
    }
}

由于要使用用户输入的排序列表,因此,您应该拥有一个数组,可以在其中存储和从中检索数据。因此,如果某些数据已经存在,请遍历数组并填充应有的单元格。还要在此处定义onTextEntered回调函数,以告知单元格如果调用了该方法(在您的情况下,将UITextView的文本存储在您的数组中)。

//your carrier, if you store the already existing user inputs some where, map them in here
//depending on how you calculate the number of cells, this array has to have the same size so use the same logic for this
var yourStringCarrierArray: [String?] = [] 

override func tableView(_ tableview: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "YourTableViewCell", for: indexPath) as! CustomTableViewCell
    cell.setup()
    cell.onTextEntered = { input in
        if let text = input {
            self.yourStringCarrierArray[indexPath.row] = text
        }
    if indexPath.row < yourStringCarrierArray.count {
        cell.textView.text = yourStringCarrierArray[indexPath.row] ?? "placeholder string, because there's no input here so far"
    }
}

我希望这会帮助或至少给您一个新的观点,这已经有一段时间了,我用Swift编写了代码。如有疑问,请随时问我。

答案 2 :(得分:0)

使用一个对象保存字符串值,因为swift中的String是值类型。这是一个示例:

class TestViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    var dataArray: [CellData] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        tableView.delegate = self
        tableView.dataSource = self

        for _ in 0..<20 {
            dataArray.append(CellData())
        }
    }


}

extension TestViewController: UITableViewDelegate, UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TestTableViewCell", for: indexPath) as! TestTableViewCell

        cell.setData(data: dataArray[indexPath.row])

        return cell
    }
}

class TestTableViewCell: UITableViewCell {

    @IBOutlet weak var textView: UITextView!

    var data: CellData!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        textView.text = ""
        textView.delegate = self
    }

    func setData(data: CellData) -> Void {
        self.data = data
        self.textView.text = data.stringValue
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

extension TestTableViewCell: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        self.data.stringValue = textView.text
    }
}

class CellData {

    var stringValue: String = ""

}