Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios segue之后传递的Nil值_Ios_Swift - Fatal编程技术网

Ios segue之后传递的Nil值

Ios segue之后传递的Nil值,ios,swift,Ios,Swift,我有一个让我发疯的问题,我的价值观在我的主VC中运行,该VC名为ViewController,适用于年龄和性别,我用print语句对此进行了测试,结果有效,如下所示 @IBAction func uploadBtnAction(_ sender: UIButton) { NetworkServices.instance.getGender(image: imageView1.image!) { (gender) in self.Gender = gender //

我有一个让我发疯的问题,我的价值观在我的主VC中运行,该VC名为ViewController,适用于年龄和性别,我用print语句对此进行了测试,结果有效,如下所示

@IBAction func uploadBtnAction(_ sender: UIButton) {
    NetworkServices.instance.getGender(image: imageView1.image!) { (gender) in
      self.Gender = gender
     // print(self.Gender!) // This prints a value
    }
    NetworkServices.instance.getAge(image: imageView1.image!) { (age) in
      self.Age = age
     // print(self.Age!) //This prints a value
    }
    performSegue(withIdentifier: "updates", sender: self)
  }
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "updates" {
      let destinationVC = segue.destination as! SecondViewController
      destinationVC.userImage = image1
      destinationVC.genderFromUser = Gender
      destinationVC.ageFromUser = Age
    }
  }
但是,当我转到下面另一个名为SecondViewController的VC时,我突然收到一个错误“Thread 1:Fatal error:在展开可选值时意外发现nil”,我创建了变量来保存来自第一个VC的值,但第一个VC在顺序后没有传递值,请帮助,我已经检查了stackoverflow,并尝试了所有的解决方案,但都没有效果,我认为这应该是最简单的部分,有趣的是,我的图像在序列中成功地从第一个VC传递到第二个VC。请给我一些建议

import UIKit
 import CLTypingLabel
class SecondViewController: UIViewController {
  var userImage: UIImage?
  var genderFromUser: String?
  var ageFromUser: Int?
  override func viewDidLoad() {
    super.viewDidLoad()
    imageView2.image = userImage
    genderlabel.text = "Gender:"
    ageLabel.text = "Age:"
    print(ageFromUser!) // fatal error here
    print(genderFromUser!) // fatal error here
    print(userImage) // This is always successful
   // ageUser.text =
    // genderUser.text = userGender
    // Do any additional setup after loading the view.
  }
  @IBOutlet weak var ageUser: UILabel!
  @IBOutlet weak var genderUser: UILabel!
  @IBOutlet weak var imageView2: UIImageView!
  @IBOutlet weak var genderlabel: CLTypingLabel!
  @IBOutlet weak var ageLabel: CLTypingLabel!
}          

我的目标是将标签设置为从第一个VC传递到第二个VC的值。

问题在于操作顺序。您的
NetworkServices.instance.get…
方法是异步的。我将使用数字显示代码实际运行的顺序:

@IBAction func uploadBtnAction(_ sender: UIButton) {

    NetworkServices.instance.getGender(image: imageView1.image!) { (gender) in
      self.Gender = gender // 2 or 3
    }
    NetworkServices.instance.getAge(image: imageView1.image!) { (age) in
      self.Age = age // 3 or 2
    }
    performSegue(withIdentifier: "updates", sender: self) // 1
}
因此,在设置
self.Gender
self.Age
之前,将执行segue,并调用
prepare
,并设置实例变量
genderFromUser
ageFromUser
。因此,它们被设置为
nil
,因为这就是它们当时的状态

当然,稍后会出现异步代码并设置
self.Gender
self.Age
,但为时已晚;火车已经出站了。SecondViewController已存在,并且已使用
nil
值配置它

当然,由于它确实存在,您现在可以再次设置这些实例属性,并让SecondViewController更新其接口作为响应。或者你可以想出其他的解决办法。一般来说,这是一个棘手的问题——当视图控制器的数据尚未准备好并且必须异步获取时,转换到另一个视图控制器的问题


[此外,在制定解决方案时,您需要问问自己,如果数据从未到达,会发生什么情况。如果网络选择在用户点击按钮的同时关闭,会发生什么情况?欢迎来到现实生活中的混乱世界!]

谢谢您的回答,我完全理解现在的问题所在,这是我的第一个应用程序,我从来没有想过我会遇到这样的问题,在我的头脑中,这部分应该是最简单的,但事实证明是困难的,现在,我希望我能在某处找到解决方案或想出一个。真是惊醒了。