我正在尝试将一个视图控制器中的文本字段数据传输到另一个视图控制器中的标签。
我该如何从另一个视图控制器的代码中调用视图控制器实例?我正在使用故事板,因此我没有在代码中创建视图控制器的实例?这些实例是否会自动创建?它们的名称是什么?
谢谢您的帮助!
我正在尝试将一个视图控制器中的文本字段数据传输到另一个视图控制器中的标签。
我该如何从另一个视图控制器的代码中调用视图控制器实例?我正在使用故事板,因此我没有在代码中创建视图控制器的实例?这些实例是否会自动创建?它们的名称是什么?
谢谢您的帮助!
在您的项目中添加一个新的Cocoa Touch类文件,命名为FirstViewController
,并将以下代码设置在其中:
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var textField: UITextField! // FIXME: link this to the UITextField in the Storyboard!!!
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let controller = segue.destinationViewController as! SecondViewController
controller.text = textField.text
}
}
在您的项目中添加一个新的Cocoa Touch类文件,将其命名为SecondViewController
并在其中设置以下代码。import UIKit
class SecondViewController: UIViewController {
var text: String?
@IBOutlet weak var label: UILabel! // FIXME: link this to the UILabel in the Storyboard!!!
override func viewDidLoad() {
super.viewDidLoad()
label.text = text
}
}
在Storyboard中,将第一个视图控制器嵌入UINavigationController
。使用UIButton
或UIBarButtonItem
将第一个视图控制器链接到第二个视图控制器。将第一个视图控制器的名称设置为FirstViewController
,第二个视图控制器的名称设置为SecondViewController
。在第一个视图控制器中创建一个UITextField
。在第二个视图控制器中创建一个UILabel
。将文本字段和标签分别链接到FirstViewController
和SecondViewController
中的相应声明。FirstViewController
并将以下代码设置在其中:import UIKit
class FirstViewController: UIViewController, DetailsDelegate {
@IBOutlet weak var label: UILabel! // FIXME: link this to the UILabel in the Storyboard
func updateLabel(withString string: String?) {
label.text = string
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let controller = segue.destinationViewController as! SecondViewController
controller.delegate = self
}
}
在你的项目中添加一个新的Cocoa/Cocoa Touch类文件,将其命名为SecondViewController
并将以下代码设置在其中:import UIKit
protocol DetailsDelegate: class {
func updateLabel(withString string: String?)
}
class SecondViewController: UIViewController {
weak var delegate: DetailsDelegate?
@IBOutlet weak var textField: UITextField! // FIXME: link this to the UITextField in the Storyboard
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
delegate?.updateLabel(withString: textField.text)
}
}
在Storyboard中,将第一个视图控制器嵌入到UINavigationController
中。使用UIButton
或UIBarButtonItem
将第一个视图控制器连接到第二个视图控制器。将第一个视图控制器的名称设置为FirstViewController
,第二个视图控制器的名称设置为SecondViewController
。在第一个视图控制器中创建一个UILabel
。在第二个视图控制器中创建一个UITextField
。将文本字段和标签链接到它们在FirstViewController
和SecondViewController
中的相应声明。
Imanou Petit和Oscar Swanros已经正确回答了。但是我有一个相当“hacky”的替代方法,用于在没有连接它们的segue的情况下在2个视图控制器之间传输数据。
要获取您应用程序的根视图控制器,可以执行以下操作:
UIApplication.sharedApplication().windows[0].rootViewController
从那里开始,您可以获取您想要的任何视图控制器。例如,如果您想要根视图控制器的第二个子视图控制器,则可以执行以下操作:
let viewController = UIApplication.sharedApplication().windows[0].rootViewController?.childViewControllers[1] as? YourViewController
viewController?.yourProperty = newValue
请记住,这种方法相当“hacky”,可能违反最佳编码实践。
ViewController A
。Control
键,点击ViewController A
,将蓝色线拖动到ViewController B
。如果ViewController A
嵌入在NavigationController
中,则在松开时出现的菜单中选择“show”。否则,选择“present modally”。ViewController A
上触发segue时,您只需要调用(可能是在按钮点击时):@IBAction func buttonTapped() {
self.performSegueWithIdentifier("DetailSegue", sender: self)
}
ViewController B
传递一个值,在ViewController A
上重写prepareForSegue:sender
方法:override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if segue.identifier == "DetailSegue" {
var viewControllerB = segue.destinationViewController as ViewControllerB
viewControllerB.text = self.textField.text
}
}
class ViewControllerB: UIViewController {
ver label = UILabel(...)
var text: String?
override func viewDidLoad() {
super.viewDidLoad()
label.text = text!
}
}