在swift中从另一个访问ViewController的实例

我正试图将数据从一个视图控制器的文本字段传输到另一个视图的标签。

我如何从另一个View Controller的代码调用View Controller实例? 我正在使用故事板,因此我从来没有在代码中创build视图控制器的实例? 这些实例是否自动创build? 他们有什么名字?

谢谢你的帮助!

1.如果包含文本字段的视图控制器可以调用(用segue)包含标签的视图控制器…

在您的项目中添加一个新的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中,将第一个视图控制器embedded到UINavigationController 。 使用UIButtonUIBarButtonItem将第一个视图控制器链接到第二个视图控制器。 将第一个视图控制器的名称设置为FirstViewController ,将第二个视图控制器的名称设置为SecondViewController 。 在第一个视图控制器中创build一个UITextField 。 在第二个视图控制器中创build一个UILabel 。 将文本字段和标签链接到FirstViewControllerSecondViewController各自的声明。

2.如果包含标签的视图控制器可以调用包含文本字段的视图控制器

在这里,这是一个完美的协议/代表案例。 你可能会发现在StackOverflow处理这个很多东西。 但是,这是一个粗略的例子。

在您的项目中添加一个新的Cocoa Touch类文件,将其命名为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中,将第一个视图控制器embedded到UINavigationController 。 使用UIButtonUIBarButtonItem将第一个视图控制器链接到第二个视图控制器。 将第一个视图控制器的名称设置为FirstViewController ,将第二个视图控制器的名称设置为SecondViewController 。 在第一个视图控制器中创build一个UILabel 。 在第二个视图控制器中创build一个UITextField 。 将文本字段和标签链接到FirstViewControllerSecondViewController各自的声明。

Imanou Petit和Oscar Swanros已经正确回答了。 然而,还有一个替代scheme,我不得不使用两个视图控制器之间的数据传输,而不是连接它们。

要获得你的应用程序的根视图控制器,你可以这样做:

 UIApplication.sharedApplication().windows[0].rootViewController 

从那里你可以得到任何你想要的视图控制器。 例如,如果你想要根视图控制器的第二个子视图控制器,那么你会这样做:

 let viewController = UIApplication.sharedApplication().windows[0].rootViewController?.childViewControllers[1] as? YourViewController viewController?.yourProperty = newValue 

请记住,这种方法是相当“黑客”,可能违反了最佳编码实践。

您需要在视图控制器之间创build一个Segue:

  1. 在Storyboard上,selectViewController A
  2. 在按住Control键的同时,单击ViewController A ,将蓝线拖放到ViewController B 。 如果将ViewController Aembedded到NavigationController ,请从放开时出现的菜单中select“显示”。 否则,请select“以模态呈现”。
  3. 在Storyboard上selectSegue,在Utilities面板上,进入Attributes Inspector并为你的Segue指定一个标识符(例如:“DetailSegue”)。

现在,当你想触发ViewController A上的segue时,你只需要调用(也许在一个button上):

 @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 } } 

非常简单

请注意,为了这个工作,你的ViewController B类应该看起来像这样:

 class ViewControllerB: UIViewController { ver label = UILabel(...) var text: String? override func viewDidLoad() { super.viewDidLoad() label.text = text! } } 

希望这可以帮助。