Получить и передать текст из TextField, который находится в пользовательском подклассе TableViewCell - PullRequest
0 голосов
/ 24 марта 2020

Как я могу использовать текст в текстовом поле из пользовательской ячейки?

Это контроллер приема:

class ShowName: UIViewController {


    @IBOutlet weak var showName: UILabel!


    @IBAction func unwindToShowNameData(_ unwindSegue: UIStoryboardSegue) {
        let sourceViewController = unwindSegue.source as! enterName
            showName.text = sourceViewController.name
    }


    @IBAction func unwindToShowName(_ unwindSegue: UIStoryboardSegue) {
    }

}

Это контроллер отправки:

class enterName: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var name: String?

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

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



    @IBAction func clickSave(_ sender: UIBarButtonItem) {
        let cell = nameCell()
        name = cell.nameText.text
        performSegue(withIdentifier: "passData", sender: self)
    }
}

Это класс Cell с TextField:

class NameCell: UITableViewCell {

    @IBOutlet weak var nameText: UITextField!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

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

        // Configure the view for the selected state
    }

}

Есть идеи?

1 Ответ

0 голосов
/ 24 марта 2020

На самом деле это то же решение, что и мое предложение в предыдущем вопросе.

Добавьте обратный вызов в ячейку и вызовите его, когда вызывается метод делегата текстового поля. Не забудьте подключить делегат текстового поля в Интерфейсном Разработчике.

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

class NameCell: UITableViewCell, UITextFieldDelegate {

    @IBOutlet weak var nameText: UITextField!

    var callback : ((UITableViewCell, String) -> Void)?

    func textFieldDidEndEditing(_ textField: UITextField) {
        callback?(self, nameText.text)
    }
}

Если у вас более одной строки, вам нужно объявите массив источника данных, чтобы сохранить значения текстовых полей. Это пример для 4 строк

var values = ["", "", "", ""]

Это методы источника данных, в cellForRow обратный вызов обновляет модель

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "nameCell", for: indexPath) as! NameCell
    cell.nameText.text = values[indexPath.row]
    cell.callback = { [unowned self] cCell, cName in
        let currentIndexPath = tableView.indexPath(for: cCell)!
        self.values[currentIndexPath.row] = cName
    }
    return cell
}

Преимущество заключается в том, что вы независимы от ячеек в методе clickSave. Получите значения из массива источника данных. И вы можете передать имя как sender параметр и передать его в prepare(for segue

@IBAction func clickSave(_ sender: UIBarButtonItem) {
    let name = values[0]
    performSegue(withIdentifier: "passData", sender: name)
}
...