在第一个ViewController

时间:2016-11-23 13:01:19

标签: ios swift

我是Swift和iOS开发的新手。我目前有2 ViewControllers,第一个button,第二个label。我已将第一个button与第二个ViewController相关联,并且转换有效。

现在,当我尝试更改标签的文本时,我收到错误:

  

致命错误:在打开Optional时意外发现nil   值

在这里,您可以在第一个ViewController找到我的准备功能:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "mySegue" {
            let vc = segue.destination as! SecondViewController
            vc.secondResultLabel.text = "Testing"
         }
    }

可能是第二个ViewController中的标签受到某种程度的保护吗?

感谢您的帮助

4 个答案:

答案 0 :(得分:5)

您需要将String传递给SecondViewController,而不是直接设置它,因为尚未创建UILabel

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "mySegue" {
        let vc = segue.destination as! SecondViewController
        vc.secondResultLabelText = "Testing"
    }
}

在您的SecondViewController viewDidLoad方法中,将UILabel设置为字符串

var secondResultLabelText : String!

override func viewDidLoad() {

    secondResultLabelText.text = secondResultLabelText
}

答案 1 :(得分:3)

在第二个视图控制器中添加一个字符串变量

var labelText: String!

在第二个视图控制器中(在viewDidLoad中)

self.secondResultLabel.text = self.labelText

然后第一个视图控制器准备segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "mySegue" {
        let vc = segue.destination as! SecondViewController
        vc.labelText = "Testing"
     }
}

这是因为第二个视图控制器的UILabel Outlet尚未在为segue做准备时进行初始化

Rikh的答案是一样的,他的答案和我的答案都是一样的

答案 2 :(得分:2)

欢迎乘坐:))

您的问题是,当您致电SecondViewController时,您的vc.secondResultLabelText,更具体的prepare未启动,因此当时secondResultLabel实际上为零。

您需要向SecondViewController添加变量,如下所示:

var labelText: String = ""

然后设置该值:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "mySegue" {
        let vc = segue.destination as! SecondViewController
        vc.labelText = "Testing"
     }
}

在您viewWillAppear的{​​{1}}或viewDidLoad中,您可以使用该SecondViewController的值,该值已准备就绪,已连接且不会崩溃

secondResultLabelText

希望有所帮助。

答案 3 :(得分:0)

首先在SecondViewController中获取一个全局变量...例如,我采用了" secondViewControllerVariable"。然后获取要在SecondViewController中显示的文本。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

    {
        if segue.identifier == "mySegue" 
            {
                let vc = segue.destination as! SecondViewController
                vc.secondViewControllerVariable = "Your string you get in FirstViewController"
            }
    }

然后在你的SecondViewController中,在viewDidLoad方法中将UILabel设置为字符串

   var secondViewControllerVariable : String! // You have to declare this first in your SecondViewController Globally 

   override func viewDidLoad() 
     {
          vc.secondResultLabelText.text = secondViewControllerVariable
     }

那就是它。快乐的编码。