无法从其他类设置UITextfield的文本

时间:2018-04-30 07:14:16

标签: ios swift uitextfield

我正在尝试使用以下代码从UITextFieldSecondViewController设置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("")"

我想我在做一些愚蠢的错误。我查了很多问题,但我找不到任何解决方案。

3 个答案:

答案 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中,您可以分配像

这样的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)
    }
}