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

时间:2017-06-08 07:53:46

标签: ios swift textfield viewcontroller

我尝试从我的第一个视图profileView访问我的视图viewController中的文本字段内容,但它不起作用。 我读到我必须使用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 prepare func:

    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不会编译代码......

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

viewController

中编写prepareforSegue方法

<强>为什么吗

因为您要将 ViewController 文本字段数据发送到 profileViewController 。这是在来源中写下您的prepareForSegue。这里,

Source = ViewController

Destination = ProfileView

注意:

  1. 在destinationViewController中使用变量( ProfileView控制器),并将textField数据保存在此变量中。
  2. 在prepareForSegue中就像这样。

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

    并在 destinationViewController (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.swift secondVC.swift

    这是输出。

    enter image description here

答案 1 :(得分:0)

您无法在准备segue中设置UITextField的文本和UIKit的任何其他组件,因为最近分配的控制器的所有View组件尚未初始化但它们是prepareForSegue中的全部为零。它们仅在showController出现时分配。

您在ViewController为当前TextField prepareForSegue设置了文字。您应该使用viewWillAppearViewControllerNotification等来弹出或解除显示的Delegate,而不应使用userDefaults方法设置文字。

答案 2 :(得分:0)

你只需要一个小修复,因为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
}

答案 3 :(得分:-1)

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

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

也永远不会在IBOutlet中调用目标控制器的prepareForSegue属性 - 这可能是导致崩溃的原因,因为此时可能无法使用奥特莱斯。相反,请使用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
            }
        }
}

login中的destinationVC是存储登录名的String变量。