我正在尝试将数据从一个View Controller的文本字段传输到另一个View标签的标签。
如何从其他View Controller的代码中调用View Controller实例?我正在使用故事板,因此我从未在代码中创建View Controller的实例?是否自动创建实例?他们有什么名字?
感谢您的帮助!
答案 0 :(得分:20)
在项目中添加一个新的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
中的相应声明。
在这里,这是一个完美的协议/委托案例。您可能会在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中,将第一个视图控制器嵌入UINavigationController
。使用UIButton
或UIBarButtonItem
将第一个视图控制器链接到第二个视图控制器。将第一个视图控制器的名称设置为FirstViewController
,将第二个视图控制器的名称设置为SecondViewController
。在第一个视图控制器中创建UILabel
。在第二个视图控制器中创建UITextField
。将文本字段和标签链接到FirstViewController
和SecondViewController
中的相应声明。
答案 1 :(得分:13)
Imanou Petit和Oscar Swanros已经正确回答。然而,有一个替代方案,而不是" hacky"我必须使用它来在两个视图控制器之间传输数据而不用segue连接它们。
要获取应用的根视图控制器,您可以执行以下操作:
UIApplication.sharedApplication().windows[0].rootViewController
从那里你可以获得你想要的任何视图控制器。例如,如果您想要根视图控制器的第二个子视图控制器,那么您将执行:
let viewController = UIApplication.sharedApplication().windows[0].rootViewController?.childViewControllers[1] as? YourViewController
viewController?.yourProperty = newValue
请记住,这种方法相当" hacky"并且可能违反了最佳编码实践。
答案 2 :(得分:5)
您需要在视图控制器之间创建一个Segue:
ViewController A
。Control
的同时,点击ViewController A
,将蓝线拖放到ViewController B
。如果ViewController A
中嵌入了NavigationController
,请在您放手时显示的菜单中选择“显示”。否则,请选择“存在模态。”现在,当你想在ViewController A
上触发segue时,你只需要打电话(可能只需按一下按钮):
@IBAction func buttonTapped() {
self.performSegueWithIdentifier("DetailSegue", sender: self)
}
要将值传递给ViewController B
,请覆盖prepareForSegue:sender
上的ViewController A
方法:
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!
}
}
希望这有帮助。