我尝试从我的第一个视图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不会编译代码......
感谢您的帮助。
答案 0 :(得分:3)
在 viewController
中编写prepareforSegue方法<强>为什么吗
因为您要将 ViewController 文本字段数据发送到 profileViewController 。这是在来源中写下您的prepareForSegue。这里,
Source = ViewController
Destination = ProfileView
注意:
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
这是输出。
答案 1 :(得分:0)
您无法在准备segue中设置UITextField
的文本和UIKit
的任何其他组件,因为最近分配的控制器的所有View
组件尚未初始化但它们是prepareForSegue
中的全部为零。它们仅在showController出现时分配。
您在ViewController
为当前TextField
prepareForSegue
设置了文字。您应该使用viewWillAppear
,ViewController
或Notification
等来弹出或解除显示的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变量。