Как сохранить текст на основе тега.
Я использовал UITextField в UITableViewCell.
Мой viewcontroller: -
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "Cell"
var cell: NH_QuestionListCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell
if cell == nil {
tableView.register(UINib(nibName: "NH_QuestionListCell", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell
}
cell.contentView.backgroundColor = UIColor.clear
cell.textadd = {[weak self] in
if let i = self?.tableview.indexPath(for: $0) {
print("the selected text\(cell.textname ?? "")")
print(i)
print("the Selected button is \(cell.textname ?? "")")
print(i)
cell.setText(Options:(self?.questionViewModel.datafordisplay(atindex: indexPath))!)
let model = self?.questionViewModel.datafordisplay(atindex: indexPath)
print(model?.values ?? "")
if model?.isSelected == true{
cell.texttype.tag = indexPath.row
// cell.texttype.text = questionViewModel.datafordisplay(atindex: indexPath)
}
return cell
}
Tableviewcell: -
@IBOutlet weak var texttype: UITextField!
var textname:String?
var textadd : ((NH_QuestionListCell) -> Void)?
@IBAction func TextAction(_ sender: UITextField) {
print(texttype.text)
// self.question.text = texttype.text
let index = texttype.tag
self.textname = texttype.text
self.textname = texttype.text
print(self.textname)
print(texttype.text)
textadd?(self)
}
func setText(Options:NH_OptionsModel)
{
self.displaySmiley.isHidden = true
self.viewdisplay.isHidden = false
self.imagebutton.isHidden = true
self.question.isHidden = true
self.displayRatingView.isHidden = true
print(Options.values)
Options.values = self.textname
print(Options.values)
}
func textFieldDidBeginEditing(_ textField: UITextField) {
texttype.text = ""
}
func textFieldShouldClear(_ textField: UITextField) -> Bool
{
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
self.TextAction(texttype)
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
return true;
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
return true;
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
print(texttype.text)
texttype.resignFirstResponder()
return true
}
Получил вывод. В первой ячейке я ввел текст в текстовое поле и нажал «ввести». Потом я пролистал. В то время я обнаружил, что набранный мной текст доступен в других ячейках. Как исправить эту проблему?
Непонятно, о чем вы спрашиваете, и код очень неорганизован.
@Rigo Я закодировал таким образом, поэтому теперь мой вопрос: сначала я ввожу один текст в текстовое поле, после этого в следующей ячейке мне нужно было ввести текст, но здесь отображается текст первой ячейки во второй ячейке. при прокрутке в каждой ячейке отображается один и тот же текст. Как это исправить?
@Rigo как решить проблему?
Пожалуйста, прочтите как задать хороший вопрос и как создать минимальный, полный и проверяемый пример





Вам не нужно использовать ячейку tag, поскольку вы используете закрытие для каждой ячейки для обработки обновления текстового поля; Это закрытие захватит indexPath, поэтому вы знаете, какую строку вы обновляете. Единственная проблема, которая может возникнуть, - это если вы разрешаете переупорядочивание ячеек либо посредством перемещения ячеек, либо с помощью возможности вставлять / удалять ячейки. В этом случае захваченный indexPath станет недействительным (это та же проблема, что и при использовании tag). Вы можете решить эту проблему, вызвав indexPath(for:) в закрытии, чтобы получить индексный путь ячейки при выполнении закрытия.
Причина появления текста при прокрутке заключается в том, что объекты ячеек используются повторно, а текст текстового поля не устанавливается явно.
Наконец, вы можете избежать всего танца weak self, поскольку, когда контроллер представления освобождается, представление таблицы будет освобождено, что означает освобождение ячеек. У вас нет цикла удержания, хотя и используется закрытие.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "Cell"
var cell: NH_QuestionListCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell
if cell == nil {
tableView.register(UINib(nibName: "NH_QuestionListCell", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell
}
cell.contentView.backgroundColor = UIColor.clear
cell.setText(options: self.questionViewModel.datafordisplay(atindex: indexPath))
cell.textadd = {
self.questionViewModel.setData(atIndex: indexPath,text: cell.textName)
}
return cell
}
Обратите внимание, что вы не предоставили подробностей о том, как следует обновлять объект вашей модели, поэтому я вставил вызов функции, чтобы показать идею.
Я также предлагаю вам прочитать о соглашениях Swift. Использование заглавных букв в именах параметров и использование NH_ в качестве префикса класса - это не «Swifty».
что писать в setData?
Предположительно вы хотите обновить свою модель текстом, введенным пользователем?
Я обновил метод didselect. что делать в модели просмотра
как исправить проблемы?