从另一个 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
方法中设置文本,同时使用 Notification
、Delegate
或 userDefaults
等弹出或关闭呈现的 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
注:
- 在目标中使用一个变量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.swift和secondVC.swift
这是输出。
我尝试从第一个视图 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
方法中设置文本,同时使用 Notification
、Delegate
或 userDefaults
等弹出或关闭呈现的 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
注:
- 在目标中使用一个变量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.swift和secondVC.swift
这是输出。