我正在尝试使用以下代码从UITextField
为SecondViewController
设置FirstViewController
的文字:
// First ViewController
@IBAction func buttonAction(_ sender: Any) {
let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController
viewController?.sampleTxtField?.text = "world"
if let navigator = self.navigationController {
navigator.pushViewController(viewController!, animated: true)
}
}
// Second ViewController
@IBOutlet weak var sampleTxtField: UITextField?
override func viewDidLoad() {
super.viewDidLoad()
print("the textfield value is,\(String(describing: sampleTxtField?.text))")
}
在我收到的日志中:"the textfield value is,Optional("")"
我想我在做一些愚蠢的错误。我查了很多问题,但我找不到任何解决方案。
答案 0 :(得分:2)
你的代码错了。
let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController
viewController?.sampleTxtField?.text = "world"
在上面的语句中,视图未在UI中加载,因此sampleTxtField
始终为nil,而是在SecondVC中创建属性var sample : String?
并按上述方式分配。然后在SecondVC的viewDidload中,将值指定为textField.text = sample
// First ViewController
@IBAction func buttonAction(_ sender: Any) {
let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController
viewController?.sample = "world"
if let navigator = self.navigationController {
navigator.pushViewController(viewController!, animated: true)
}
}
//第二个ViewController
@IBOutlet weak var sampleTxtField: UITextField?
var sample : String?
override func viewDidLoad() {
super.viewDidLoad()
sampleTxtField.text = sample
print("the textfield value is,\(String(describing: sampleTxtField?.text))")
}
答案 1 :(得分:1)
在第二个viewController中创建一个变量,如下所示:
var sampleText: String!
在第二个视图控制器的viewDidLoad()
中写下:
sampleTxtField?.text = sampleText
并在第一个视图中使用控制器替换viewController?.sampleTxtField?.text = "world"
行:
viewController.sampleText = "world"
这是从另一个类为textField设置值的标准方法。
答案 2 :(得分:1)
当你使用instantiateViewController(withIdentifier:)
方法从storyboard实例化UIViewController时,它会创建一个ViewController的新实例并返回它,但是UIView及其元素在内存中加载UIView之前不会初始化。
ViewDidLoad()在视图控制器的内容视图( 其视图层次结构的顶部)是从故事板创建和加载的。 视图控制器的插座保证具有有效值 调用此方法的时间。
因此,您需要在ViewDidLoad中配置UI元素值,以使这些元素具有适当的值。
在你的情况下,viewController?.sampleTxtField?.text = "world"
行不能用作尚未加载到内存中的视图。要解决此问题,您需要定义一个String变量,并在初始化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
中,您可以分配像
@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)
}
}