Ios segue之后传递的Nil值
我有一个让我发疯的问题,我的价值观在我的主VC中运行,该VC名为ViewController,适用于年龄和性别,我用print语句对此进行了测试,结果有效,如下所示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 //
@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更新其接口作为响应。或者你可以想出其他的解决办法。一般来说,这是一个棘手的问题——当视图控制器的数据尚未准备好并且必须异步获取时,转换到另一个视图控制器的问题
[此外,在制定解决方案时,您需要问问自己,如果数据从未到达,会发生什么情况。如果网络选择在用户点击按钮的同时关闭,会发生什么情况?欢迎来到现实生活中的混乱世界!]谢谢您的回答,我完全理解现在的问题所在,这是我的第一个应用程序,我从来没有想过我会遇到这样的问题,在我的头脑中,这部分应该是最简单的,但事实证明是困难的,现在,我希望我能在某处找到解决方案或想出一个。真是惊醒了。