Передача данных из второго VC в первый VC, а также отображение в текстовом поле Swift4 - PullRequest
0 голосов
/ 04 мая 2018

Я получаю данные из второго VC в первый VC по протоколу или делегатам. Данные поступают в первый VC, но проблема в том, что данные не отображаются в текстовом поле. Вот мой полный код для понимания. Любые усилия приветствуются.

Первый класс VC

import UIKit

class firstViewController: UIViewController, UITextFieldDelegate, MyProtocol {

var valueSentFromSecondViewController               : String?
@IBOutlet weak var myTextField                      : UITextField!

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

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func myTextFieldACTIONWhenEditingDidBegin(_ sender: Any) {
    myTextField.isUserInteractionEnabled = false
    let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as! secondViewController

    secondVC.delegate = self
    self.navigationController?.pushViewController(secondVC, animated: true)
}

func setResultsAfterEvaluation(valueSent: String) {
    self.valueSentFromSecondViewController = valueSent
    print(valueSentFromSecondViewController!) // Ahtazaz(DATA showing here)
    myTextField.text = valueSentFromSecondViewController //This's the problem, Why not showing here in this this TextField
}
}

Теперь, SecondVC Class

import UIKit

protocol MyProtocol {
func setResultsAfterEvaluation(valueSent: String)

}

class secondViewController: UIViewController {

var delegate            :   MyProtocol?
var sentValue           :   String?

override func viewDidLoad() {
    super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func btn(_ sender: Any) {
    let firstVC = self.storyboard?.instantiateViewController(withIdentifier: "firstViewController") as! firstViewController
    self.navigationController?.pushViewController(firstVC, animated: true)

    sentValue = "Ahtazaz"
    delegate?.setResultsAfterEvaluation(valueSent: sentValue!)
}

}

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы нажимаете SecondVC. Затем в SecondVC вы нажимаете снова FirstVC. Я думаю, что именно здесь вы делаете ошибку.

let firstVC = self.storyboard?.instantiateViewController(withIdentifier: "firstViewController") as! firstViewController

Вы создаете новый экземпляр FirstVC. Затем вы нажимаете на это, что неправильно. Позвоните своему делегату, а затем вернитесь к предыдущему (FirstVC) контроллеру

Попробуйте этот код в действии вашей кнопки

@IBAction func btn(_ sender: Any) {
sentValue = "Ahtazaz"
delegate?.setResultsAfterEvaluation(valueSent: sentValue!)
self.navigationController?.popViewController(animated: true)
}

Это должен быть правильный подход, вместо повторного нажатия на контроллер.

0 голосов
/ 04 мая 2018

Шаги просты в использовании Delegates для передачи данных в предыдущий VC

Второй VC:

В верхней части VC объявите протокол следующим образом:

protocol MenuListingDelegate {
func callBackOfMenuSelected(arrSelectedCategory:[Int],isFromWhichPopup:Int)

}

Тогда внутри, которые определяют variable, как это

var delegate:MenuListingDelegate?

А затем предоставьте данные делегату следующим образом. В моем случае я предоставляю это по нажатию button перед всплывающим окном просмотра контроллера

self.delegate?.callBackOfMenuSelected(strToPass: "Hello")

Теперь в первом ВК:

Вверху определите метод Delegate следующим образом:

class DayDetailVC: UIViewController,MenuListingDelegate {}

И получить данные вот так

  //MARK:- Menu Listing Delegate

    func callBackOfMenuSelected(strToPass: String) {
     print(strToPass)

    }

Примечание: - Не забудьте объявить делегата второго виртуального контейнера, где мы используем это. secondVC.delegate = self.

Изменить Проверить следующие случаи

Случай 1: - Проверьте выходы myTextField Я думаю, проблема в этом. Если все в порядке, удалите розетку и установите ее снова

Случай 2: - Все еще, если не работает, попробуйте установить как это

func setResultsAfterEvaluation(valueSent: String) {
myTextField.text = "\(valueSent)" 
}

Надеюсь, это поможет.

Редактировать 2

Я видел, что вы использовали pushViewController в следующих строках: Таким образом, вы можете просто использовать следующую строку кода для передачи данных в firstVC

In SecondVC добавить следующий код:

 let firstVC = self.storyboard?.instantiateViewController(withIdentifier: "firstViewController") as! firstViewController
firstVC.valueSentFromSecondViewController = "Hello World"
self.navigationController?.pushViewController(firstVC, animated: true)

Сейчас в FirstVC

Используйте как в viewDidLoad() или где угодно

print(valueSentFromSecondViewController) //Hello World

Приветствия это сделано.

Выберите, как вы хотите.

Примечание: - Но я предлагаю вам использовать popViewController вместо pushViewController при возврате из SecondVC -> FirstVC . Отдых зависит от ваших требований.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...