Прокрутка перестановок данных в табличном представлении в UITextfield в Swift - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть табличное представление, в котором ячейка состоит из нескольких разделов, каждый раздел имеет различное количество строк, а каждая строка имеет текстовое поле.Когда я написал в нем и прокрутите вниз и вверх данные потеряли или перетасовали.Поэтому я пытаюсь сохранить данные текстового поля в двухмерном массиве, но не могу решить эту проблему.

Вот код в пользовательской ячейке:

class CustomCell: UITableViewCell {

    @IBOutlet weak var userName: UITextField!
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
}

Просмотр кода контроллера:

extension ViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let label = UILabel()
        label.text = "Header"
        return label
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 7
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = self.tableview.dequeueReusableCell(withIdentifier: CustomCell.identifier, for: indexPath) as! CustomCell
        return cell

    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 80.0
    }
}

1 Ответ

0 голосов
/ 30 декабря 2018

От ваших ячеек нельзя ожидать сохранения данных (содержимого вашего UITextField), поскольку они удаляются из памяти, как только они выходят за видимые границы вашего табличного представления.

Вы должны заглянуть в протокол UITableViewDataSource и сохранить содержимое UITextFields вашей ячейки в классе, который останется в памяти на время контроллера представления табличного представления.

Как правило, люди используют контроллер представления в качестве источника данных, как и вы.

Шаги следующие:

  • При инициализации контроллера представления создайте и подготовьте структуру данных (массив / словарь с ключами на IndexPaths), которая будет содержать содержимое нужного вам текста.для хранения
  • При снятии очереди с ячейки (в вашей функции cellForRowAt) настройте ячейку с необходимой строкой из вашей структуры данных, если для этого конкретного indexPath существует содержимое.
  • Когда текстизменено пользователем в ячейке, уведомите источник данных о новом содержимом для пути индекса ячейки

Пример:

Определите следующий протокол:

protocol DataSourceUpdateDelegate: class {
    func didUpdateDataIn(_ sender: UITableViewCell, with text: String?)
}

Убедитесь, что ваш UITableViewCell объявляет переменную-делегат и использует ее:

class MyCell: UITableViewCell, UITextFieldDelegate {
    @IBOutlet var myTextField: UITextField!
    weak var dataSourceDelegate: DataSourceUpdateDelegate?

    func configureCellWithData(_ data: String?, delegate: DataSourceUpdateDelegate?)
    {
        myTextField.text = data
        myTextField.delegate = self
        dataSourceDelegate = delegate
    }

    override func prepareForReuse() {
        myTextField.text = ""
        super.prepareForReuse()
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        dataSourceDelegate?.didUpdateDataIn(self, with: textField.text)
    }
}

Убедитесь, что ваш View Controller соответствует DataSourceUpdateDelegate, и инициализируйте переменную для управления данными:

class MyViewController: UITableViewController, UITableViewDataSource, DataSourceUpdateDelegate {
    var data = [IndexPath : String]()

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = MyCell() // Dequeue your cell here instead of instantiating it like this
        let cellData = data[indexPath]
        cell.configureCellWithData(cellData, delegate: self)
        return cell
    }

    func didUpdateDataIn(_ sender: UITableViewCell, with text: String?) {
        data[tableView.indexPath(for: sender)!] = text
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...