将数据发送到另一个视图:无法解开选项

时间:2014-06-20 21:53:05

标签: swift

我知道这必须是一个简单的解决方案,但似乎无法理解为什么我的代码无效。基本上我试图将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

}

3 个答案:

答案 0 :(得分:2)

var VC = ViewController()创建一个ViewController的新实例。除非有默认值,否则您不会从VC.Text1st.text中获得任何值。你真的应该在你的第二个视图控制器上使用一个字符串变量来传递数据。

另外,关于常见格式的说明:

  1. 班级名称应以大写字母(如您所示)
  2. 开头
  3. 方法/函数名称应以小写字母开头
  4. UIViewController子类应该有" Controller"包含在他们的名字中,否则,看起来它是UIView的一个子类,它是一个完全不同级别的模型视图控制器(所有UIKit和Cocoa框架的体系结构)
  5. 修改

    以下是一些示例代码:

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