Обратное значение из одного представления в другое с использованием протокола в Swift - PullRequest
0 голосов
/ 17 февраля 2020

Теперь я изучаю быстрое программирование и застрял в грамматике протокола.

Есть простая функция, которую я хочу реализовать: в одном Main.Storyboard я создал два ViewController. Первый ViewController имеет метку и кнопку для go для второго ViewController. Второй имеет textField и кнопку для go возврата к первому ViewController.

Я ввел несколько слов в textField и нажал кнопку go -back, чтобы закрыть вид, но не вижу, как метка изменилась в первом представлении.

Вот что я я закодировал для представления делегата:

import UIKit

protocol SecondViewDelegate {
    func getText(text: String)
}

class SecondViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!

    var text: String?
    var delegate: SecondViewDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
    }

    @IBAction func backButton(_ sender: UIButton) {
//        print(text!)
        delegate?.getText(text: text!)
        dismiss(animated: true, completion: nil)
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
//        print("textFieldDidEndEditing has been called")
        text = textField.text
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.endEditing(true)
        return true
    }
}

Я распечатал текст, когда нажал кнопку BackButton, и я уверен, что текст, напечатанный на консоли, - это то, что я ввел в textField.

А вот код для другого представления, в котором был показан текст:

class ViewController: UIViewController, SecondViewDelegate {

    @IBOutlet weak var textLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let secondVC = SecondViewController()
        secondVC.delegate = self
    }

    @IBAction func clickButton(_ sender: UIButton) {
        performSegue(withIdentifier: "goToSecond", sender: self)
    }

    func getText(text: String) {
        self.textLabel.text = text
    }

}

Когда я вернулся в представление, метка не изменилась. И я добавил точку останова в функцию getText и запустил приложение, приложение не взломало sh.

Я не знаю, какую часть я сделал неправильно. Кто-нибудь может указать на проблему, чтобы помочь мне? Спасибо!

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

В вашем первом контроллере просмотра, если вы используете переходы к go для второго контроллера просмотра, вам необходимо установить метод delegates in prepareForSegue. В настоящее время вы создаете новый объект в viewDidLoad и назначаете ему делегата, что неправильно.

Вот решение:

class ViewController: UIViewController, SecondViewDelegate {

    @IBOutlet weak var textLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func clickButton(_ sender: UIButton) {
        performSegue(withIdentifier: "goToSecond", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToSecond" {
            if let vc = segue.destination as? SecondViewController {
                vc.delegate = self 
            }
        }
    }

    func getText(text: String) {
        self.textLabel.text = text
    }

}
1 голос
/ 17 февраля 2020

Пожалуйста, добавьте этот метод в свой код для прохода делегата.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToSecond" {
        if let vc = segue.destination as? SecondViewController {
            vc.delegate = self 
        }
    }
}

И удалите эти строки кода.

let secondVC = SecondViewController()
secondVC.delegate = self
...