更新: 因此,这样做的目的是将用户输入的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] =文本的数组。请帮助或让我知道如果我对过程的理解是错误的,将很乐意学习!
答案 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 = ""
}