Когда вы создаете экземпляр UIViewController из раскадровки с использованием метода instantiateViewController(withIdentifier:)
, он создает новый экземпляр ViewController и возвращает его, но UIView и его элементы не инициализируются, пока UIView не будет загружен в память.
ViewDidLoad () вызывается, когда представление содержимого контроллера представления (
вершина его иерархии представления) создается и загружается из раскадровки.
Выходные данные контроллера представления гарантированно будут иметь действительные значения
время вызова этого метода.
Таким образом, вам необходимо настроить значения элементов пользовательского интерфейса в ViewDidLoad, чтобы иметь правильное значение для этих элементов.
В вашем случае строка viewController?.sampleTxtField?.text = "world"
не будет работать, поскольку представления еще не загружены в память. Чтобы решить эту проблему, вам нужно определить строковую переменную и присвоить значение после инициализации ViewController. Затем в ViewDidLoad вы можете присвоить значение String текстовому свойству UITextField.
class SecondViewController: UIViewController {
@IBOutlet weak var sampleTxtField: UITextField!
var sampleText: String? //it can be var also with default value
func viewDidLoad() {
super.viewDidLoad()
//assign the textField Value here
if let text = sampleText {
self.sampleTxtField.text = text
}
}
}
Теперь в FirstViewController
вы можете назначить свойство sampleText, например
@IBAction func buttonAction(_ sender: Any) {
guard let secondViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController else {
fatalError("No ViewController with Identifier "SecondViewController")
}
secondViewController.sampleText = "world"
if let navigator = self.navigationController {
navigator.pushViewController(secondViewController, animated: true)
}
}