TextFields не обновляется со значениями в функции раскрутки Swift - PullRequest
0 голосов
/ 10 мая 2019

У меня есть textfields, которое должно получить значение, отображаемое после возврата из TableViewController, где пользователь выбирает ячейку.Я получаю это значение в функции unwind, но textfields не обновляется.При печати значения оно печатается правильно при размотке, поэтому unwind должно быть установлено правильно, но оно просто не отображается в его textfield.Я также пробовал prepare(for unwind: в TableViewController, но с такими же результатами.Вы видите, что я делаю не так?Как всегда большое спасибо.

функция размотки:

@IBAction func unwindToDetailsVc(segue: UIStoryboardSegue) {
        //Insert function to be run upon dismiss of VC2
        print("unwindSegue triggered")
        if let vc = segue.source as? CityTableViewController {
            print("segue source is city vc : \(String(describing: vc.city!))")

            self.cityTextField.text = vc.city
        }
        if let vc = segue.source as? RegionTableViewController {
            print("segue source is region vc : \(String(describing: vc.region!))")
            self.regionTextField.text = vc.region
        }
        if let vc = segue.source as? CountryTableViewController {
            print("segue source is country vc : \(String(describing: vc.country!))")
            self.countryTextField.text = vc.country
        }
    }

didSelect в TableView:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath) as! CityTableViewCell
        self.city = cell.cityLabel.text ?? ""
        performSegue(withIdentifier: "unwindSegue", sender: self)
//        self.dismiss(animated: true, completion: nil)
    }

подготовка к размотке:

override func prepare(for unwind: UIStoryboardSegue, sender: Any?) {
        if unwind.identifier == "unwindSegue"  {
            if let detailsVc = unwind.destination as? ShopDetailsTableViewController {
                detailsVc.cityTextField.text! = city
            }
        }
    }

функция делегата текстового поля:

func textFieldDidBeginEditing(_ textField: UITextField) {
        print("Editing textfield")
        if textField.accessibilityIdentifier == "city" {
            print("Editing city textfield")
            performSegue(withIdentifier: "citySegue", sender: self)
        } else if textField.accessibilityIdentifier == "region" {
            print("Editing regio textfield")
            performSegue(withIdentifier: "regionSegue", sender: self)
        } else if textField.accessibilityIdentifier == "country" {
            print("Editing country textfield")
            performSegue(withIdentifier: "countrySegue", sender: self)
        }
    }

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Вы можете просто использовать closure для решения проблемы такого рода,

class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!

    @IBAction func openTableVC(_ sender: UIButton) {
        if let controller = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "TableViewController") as? TableViewController {
            controller.handler = {[weak self](city) in
                DispatchQueue.main.async {
                    self?.textField.text = city
                }
            }
            self.navigationController?.pushViewController(controller, animated: true)
        }
    }
}

class TableViewController: UITableViewController {
    var handler: ((String)->())?

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let city = "Delhi"
        self.handler?(city)
        self.navigationController?.popViewController(animated: true)
    }
}

Приведенный выше код является общим и будет работать в любом случае, откуда вы хотитеоткрыть TableViewController.

0 голосов
/ 11 мая 2019

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

Большое спасибо @PGDev за то, что он поделился более удобным способом кодирования этого, без всех операторов if else и unwinds. Отличный пример кодирования более высокого уровня.

...