Я пытаюсь передать текст из одного 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
}
}