从另一个 viewController 访问文本字段文本

access textfield text from another viewController

我尝试从第一个视图 viewController 访问视图 profileView 中的文本字段内容,但它不起作用。 我读到我必须使用 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {} 所以我做了,但它仍然无法正常工作,我不明白为什么。

这是我的 viewController 代码:

// This code is the code generated by xCode, only the loginField was added.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var loginField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

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


}

这是我的 profileController 准备功能:

    var login: String!
    @IBOutlet weak var myLabel: UILabel!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        print("prepare")
        if (segue.identifier == "mainMenu")
        {
            let svc = segue.source as! ViewController
            login = svc.loginField.text
            self.myLabel.text = login
            print(login)
        }
    }

实际上,我真正读到的是 "prepareForSegue" func 但是当我试图覆盖它时,xCode 不会编译代码...

感谢您的帮助。

您不能在 prepare for segue 中设置 UITextField 的文本和 UIKit 的任何其他组件,因为最近分配的控制器的所有 View 组件尚未初始化他们在 prepareForSegue 中都是 nil。他们仅在出现 viewController 时分配。

您将当前 ViewController TextField 的文本设置为 prepareForSegue。取而代之的是,您应该在 viewWillAppear 方法中设置文本,同时使用 NotificationDelegateuserDefaults 等弹出或关闭呈现的 ViewController...

从一个控制器到另一个控制器的数据流是 ios 初学者非常流行的主题。有几种方法可以实现这个目标:segues、委托模式、通知、控制器新实例的初始化、将数据保存到本地存储等。

只有当您从当前控制器切换到另一个控制器时,才应该使用 prepare(for segue: sender:) 方法。您可以通过 segue 参数的 destination 属性 访问目标控制器实例。

也永远不要在 prepareForSegue 中调用目标控制器的 IBOutlet 属性 - 这可能会导致崩溃,因为此时 Outlets 可能未初始化。而是使用 String 属性 例如。

示例代码如下:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if (segue.identifier == "mainMenu") {
            if let destinationVC = segue.destination as? ViewController {
               destinationVC.login = self.myLabel.text
            }
        }
}

其中 destinationVC 中的 login 是存储登录名的字符串变量。

您只需要一个小的修复,因为 UITextField 和 UIKit 的任何其他组件在准备 segue 时尚未初始化:

var login: String!

@IBOutlet weak var myLabel: UILabel!

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    print("prepare")
    if (segue.identifier == "mainMenu")
    {
        let svc = segue.source as! ViewController
        login = svc.loginField.text
        // self.myLabel.text = login
        print(login)
    }
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.myLabel.text = login
}

viewController

中编写 prepareforSegue 方法

为什么?

因为你想发送ViewController textfield数据到profileViewController。那就是写你的prepareForSegue在 来源 中。这里,

Source = ViewController

Destination = ProfileView

注:

  1. 在目标中使用一个变量ViewController(ProfileView Controller),并将文本字段数据保存在该变量中。

在 prepareForSegue 中像这样。

 destinationVC.someVariable = self.SourceViewLabel.text // your sourceViewController

并在您的目的地ViewController(ProfileView) 的 viewDidLoad 中写下这个。

self.profileLabel.text = somVariable

在我的第一个视图中,我写了这个。

@IBAction func nexVCAction(_ sender: Any) {

    self.performSegue(withIdentifier: "secondvc", sender: self)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier  == "secondvc" {
        let vc = segue.destination as! secondVC
        vc.stringHolder = textField.text!
    }

}

这是第二次查看代码。

import UIKit

class secondVC: UIViewController {

    @IBOutlet weak var textlabel: UILabel!
    var stringHolder:String = ""
    override func viewDidLoad() {
        super.viewDidLoad()

        textlabel.text = stringHolder

        // Do any additional setup after loading the view.
    }

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


}

我为此做了git project

只勾选FirstVC.swiftsecondVC.swift

这是输出。