Делегировать текст из TextField между представлениями контейнеров

Я пытаюсь передать текст из одного TextField в другой TextField. Оба они расположены в разных ContainerView. Пользователи могут переключаться между различными ContainerView с помощью сегментированного управления (таким образом, все мои ContainerView расположены внутри ViewController с сегментированным управлением).

Я пытался сделать это с делегированием: всякий раз, когда текст в TextFieldOne изменяется, это изменение должно влиять на другое текстовое поле, поэтому я попытался использовать действие над TextField в первом контейнере с событием «Значение изменено»:

    protocol AddOneWordViewControllerDelegate: class {
    func changeTexeValue(_ text: String)
}

class AddOneWordViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var oneWordAddWord: UITextField!
    weak var delegate: AddOneWordViewControllerDelegate?

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

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

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
    @IBAction func addOneWordWordChanged(_ sender: UITextField) {
        guard let delegate = delegate else {
            return
        }
        delegate.changeTexeValue(oneWordAddWord.text!)
    }
}

А вот мой второй контейнер, где нужно изменить textField:

    class AddTwoWordsViewController: UIViewController, UITextFieldDelegate, AddOneWordViewControllerDelegate {

    @IBOutlet weak var twoWordsAddWord: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.twoWordsAddWord.delegate = self
        let app = UIApplication.shared.delegate! as! AppDelegate
        if let viewControllers = app.window?.rootViewController?.childViewControllers {
            viewControllers.forEach({ (vc) in
                if let cont = vc as? AddOneWordViewController {
                    cont.delegate = self
                }
            })
        }
    }

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

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
    func changeTexeValue(_ text: String) {
        twoWordsAddWord.text = text
    }
}

Я следовал структуре из этого вопроса, но ничего не вышло. В чем проблема?

Мой основной контроллер просмотра:

import UIKit
import Firebase

class WordViewController: UIViewController {

@IBOutlet weak var selectedIndex: UISegmentedControl!
@IBOutlet weak var oneWord: UIView!
@IBOutlet weak var twoWords: UIView!
@IBOutlet weak var threeWords: UIView!
@IBOutlet weak var fourWords: UIView!
var ref: DatabaseReference?


var addOneWordViewController: AddOneWordViewController!
var addTwoWordsViewController: AddTwoWordsViewController!
var addThreeWordsViewController: AddThreeWordsViewController!
var addFourWordsViewController: AddFourWordsViewController!

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "oneWord" {
        addOneWordViewController = segue.destination as! AddOneWordViewController
    } else if segue.identifier == "twoWords" {
        addTwoWordsViewController = segue.destination as! AddTwoWordsViewController
    } else if segue.identifier == "threeWords" {
        addThreeWordsViewController = segue.destination as! AddThreeWordsViewController
    } else if segue.identifier == "fourWords" {
        addFourWordsViewController = segue.destination as! AddFourWordsViewController
    }
}




override func viewDidLoad() {
    super.viewDidLoad()
    ref = Database.database().reference()
    self.oneWord.alpha = 1 // setting the initial view of the first Index of Sigment View to the First Container View
    self.twoWords.alpha = 0
    self.threeWords.alpha = 0
    self.fourWords.alpha = 0
}

@IBAction func showWord(_ sender: UISegmentedControl) { // making one of the four container view vivsible depending on the Index of Segment Controller
    if sender.selectedSegmentIndex == 0 {
        UIView.animate(withDuration: 0.5, animations: {
            self.oneWord.alpha = 1
            self.twoWords.alpha = 0
            self.threeWords.alpha = 0
            self.fourWords.alpha = 0
        })
    } else if sender.selectedSegmentIndex == 1 {
        UIView.animate(withDuration: 0.5, animations: {
            self.oneWord.alpha = 0
            self.twoWords.alpha = 1
            self.threeWords.alpha = 0
            self.fourWords.alpha = 0
        })
    } else if sender.selectedSegmentIndex == 2 {
        UIView.animate(withDuration: 0.5, animations: {
            self.oneWord.alpha = 0
            self.twoWords.alpha = 0
            self.threeWords.alpha = 1
            self.fourWords.alpha = 0
        })
    } else {
        UIView.animate(withDuration: 0.5, animations: {
            self.oneWord.alpha = 0
            self.twoWords.alpha = 0
            self.threeWords.alpha = 0
            self.fourWords.alpha = 1
        })

    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
@IBAction func addWord(_ sender: Any) {
    if selectedIndex.selectedSegmentIndex == 0 {
        guard let text = addOneWordViewController.oneWordAddWord.text, !text.isEmpty else {
            return
        }
        ref?.child("LearnedWords").child(addOneWordViewController.oneWordAddWord.text!).setValue(addOneWordViewController.oneWordAddWord.text)
        presentingViewController?.dismiss(animated: true, completion: nil)
    } else if selectedIndex.selectedSegmentIndex == 1 {
        guard let text = addTwoWordsViewController.twoWordsAddWord.text, !text.isEmpty else {
            return
        }
        ref?.child("LearnedWords").child(addTwoWordsViewController.twoWordsAddWord.text!).setValue(addTwoWordsViewController.twoWordsAddWord.text)
        presentingViewController?.dismiss(animated: true, completion: nil)
    } else if selectedIndex.selectedSegmentIndex == 2 {
        guard let text = addThreeWordsViewController.threeWordsAddWord.text, !text.isEmpty else {
            return
        }
        ref?.child("LearnedWords").child(addThreeWordsViewController.threeWordsAddWord.text!).setValue(addThreeWordsViewController.threeWordsAddWord.text)
        presentingViewController?.dismiss(animated: true, completion: nil)
    } else {
        guard let text = addFourWordsViewController.fourWordsAddWord.text, !text.isEmpty else {
            return
        }
        ref?.child("LearnedWords").child(addFourWordsViewController.fourWordsAddWord.text!).setValue(addFourWordsViewController.fourWordsAddWord.text)
        presentingViewController?.dismiss(animated: true, completion: nil)
    }
}


@IBAction func cancelWord(_ sender: Any) {
    presentingViewController?.dismiss(animated: true, completion: nil) // closing this View
}

}

person Oleg Blanutsa    schedule 13.07.2017    source источник
comment
предоставьте свой код viewController, в который вы добавляете этот контейнер View   -  person Irshad Ahmad    schedule 13.07.2017
comment
Ага, я это сделал :)   -  person Oleg Blanutsa    schedule 13.07.2017