Как получить пользовательский ввод из UItextfield и добавить его в массив? - PullRequest
0 голосов
/ 08 января 2019

Я работаю в Свифте. У меня есть текстовое поле, которое находится в ячейке таблицы. Я пытаюсь сохранить текст каждого текстового поля в табличном представлении, чтобы они, когда пользователь добавляет или удаляет строку, а затем табличное представление перезагружало данные, чтобы текстовые поля оставались заполненными соответствующими данными.

Я попытался добавить функцию textfielddidendeditting, но по какой-то причине она не вызывается.

EDIT:

Вот мой код:

tableViewController:

import UIKit

var rowCount = 0
var textArray = [String]()

class TableViewController: UITableViewController {


override func viewDidLoad() {
    super.viewDidLoad()
}


override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

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

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

    return cell
}

@IBAction func addRow(_ sender: Any) {
    rowCount = rowCount + 1
    textArray.append("")
    tableView.reloadData()
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        rowCount = rowCount - 1
        textArray.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .fade)

    } else if editingStyle == .insert {
    }
}


}

tableViewCell:

import UIKit

class TableViewCell: UITableViewCell, UITextFieldDelegate {


@IBOutlet weak var textField: UITextField!

override func awakeFromNib() {
    super.awakeFromNib()
    textField.delegate = self

}

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

    // Configure the view for the selected state
}

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
    if let myIndexPath = tableView.indexPathForSelectedRow {
        let newText = textField.text
        textArray.insert(newText, at: myIndexPath)
    }

    return true
}

}

1 Ответ

0 голосов
/ 08 января 2019

Насколько я могу предположить (без какого-либо понимания кода), вы можете сделать следующее:

  1. Используйте обратный вызов в вашей ячейке, который вызывается каждый раз, когда текстовое поле заканчивает редактирование:

.

class MyTableViewCell: UITableViewCell {
       var textHasChanged: ((String) -> Void)?
       ...
    } 
    extension MyTableViewCell: UITextFieldDelegate {
    // this gets called every time the user ends editing the text field
    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
            let newValue = textField.text //here you have your value

            // now save it to your data source
            self.textHasChanged(newValue)
        }
    }
  1. В инициализаторе или в функции awakeFromNib() (зависит от вашего использования) установите для свойства .delegate текстового поля значение self

  2. Теперь, чтобы каждая ячейка отображала значение из источника данных и применяла измененный текст к вашему источнику данных tableView, добавьте следующие строки в ваш UITableViewController:

.

class MyTableViewController: UITableViewController {
    var textArray: [String] = ["abc", "def"]
    ...
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)

        cell.textField.text = textArray[indexPath.row]
        cell.textHasChanged = { (newValue) in
            self.textArray[indexPath.row] = newValue
        }
        return cell
}

Просто прокомментируйте, если у вас есть дополнительные вопросы

...