我知道这必须是一个简单的解决方案,但似乎无法理解为什么我的代码无效。基本上我试图将1视图中的文本字段中的值发送到第2个视图的标签。
ViewController.swift
@IBOutlet var Text1st: UITextField
@IBAction func Goto2ndView(sender: AnyObject) {
let view2 = self.storyboard.instantiateViewControllerWithIdentifier("view2") as MyView2
//view2.Label2nd.text=text;
self.navigationController.pushViewController(view2, animated: true)
}
MyView2.swift
@IBOutlet var Label2nd: UILabel
override func viewDidLoad() {
super.viewDidLoad()
var VC = ViewController()
var string = (VC.Text1st.text) //it doesn't like this, I get a 'Can't unwrap Option.. error'
println(string)
}
-------来自(drewag)的编辑更新代码-------
ViewController.swift
let text = "text"
var sendString = Text1st.text
println(sendString) //successfully print it out.
let view2 = self.storyboard.instantiateViewControllerWithIdentifier("view2") as MyView2
view2.Label2nd.text=sendString;
self.navigationController.pushViewController(view2, animated: true)
MyView2.swift
@IBOutlet var Label2nd: UILabel
override func viewDidLoad() {
super.viewDidLoad()
var VC = ViewController()
var string = self.Label2nd.text
println(string) //still getting the error of an unwrap optional.none
}
答案 0 :(得分:2)
var VC = ViewController()
创建一个ViewController的新实例。除非有默认值,否则您不会从VC.Text1st.text
中获得任何值。你真的应该在你的第二个视图控制器上使用一个字符串变量来传递数据。
另外,关于常见格式的说明:
修改强>:
以下是一些示例代码:
class ViewController1 : UIViewController {
...
func goToSecondView() {
var viewController = ViewController2()
viewController.myString = "Some String"
self.navigationController.pushViewController(viewController, animated: true)
}
}
class ViewController2 : UIViewController {
var myString : String?
func methodToUseMyString() {
if let string = self.myString {
println(string)
}
}
...
}
注意,我不是使用故事板创建ViewController2。我个人更喜欢避免使用故事板,因为它们不能很好地扩展,我觉得编辑它们非常麻烦。如果您愿意,您当然可以更改它以从故事板中创建视图控制器。
答案 1 :(得分:1)
jatoben你想使用可选绑定是正确的。 IBOutlets是自动选项,因此您应该检查文本字段以查看它是否为零。
if let textField = VC.Text1st {
println(textField.text)
}
这可以防止您的应用崩溃,但由于您的文字字段尚未初始化,因此不会打印任何内容。
编辑:
如果你想在你的第二个内部引用你的初始ViewController,你将不得不改变一些事情。首先在第二个viewcontroller上添加一个属性,该属性将用于第一个视图控制器:
@IBOutlet var Label2nd: UILabel //existing code
var firstVC: ViewController? //new
然后在创建view2之后,将它的firstVC设置为您当前所在的ViewController:
let view2 = self.storyboard.instantiateViewControllerWithIdentifier("view2") as MyView2 //already in your code
view2.firstVC = self //new
最后在第二个视图控制器的viewDidLoad中,使用firstVC而不是您重新创建的ViewController。它看起来像这样:
override func viewDidLoad() {
super.viewDidLoad()
if let textField = firstVC?.Text2nd {
println(textField.text)
}
}
答案 2 :(得分:0)
使用可选绑定来打开属性:
if let string = VC.Text1st.text {
println(string)
}