Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
使用Viewmodel和Firebase检索数据时,Swift推送了Viewcontroller错误_Swift_Xcode_Firebase_Google Cloud Firestore_Viewmodel - Fatal编程技术网

使用Viewmodel和Firebase检索数据时,Swift推送了Viewcontroller错误

使用Viewmodel和Firebase检索数据时,Swift推送了Viewcontroller错误,swift,xcode,firebase,google-cloud-firestore,viewmodel,Swift,Xcode,Firebase,Google Cloud Firestore,Viewmodel,我有两个ViewController,用于显示来自Firebase的数据。在第一个ViewController中,我可以在调用ViewModel时显示所需的数据。当我按下第一个ViewController中的一个按钮时,我将通过以下命令导航到第二个ViewController: navigationController?.pushViewController(secondViewController, animated: true) 我有一个从ViewModel检索的用户对象,该ViewMod

我有两个ViewController,用于显示来自Firebase的数据。在第一个ViewController中,我可以在调用ViewModel时显示所需的数据。当我按下第一个ViewController中的一个按钮时,我将通过以下命令导航到第二个ViewController:

navigationController?.pushViewController(secondViewController, animated: true)
我有一个从ViewModel检索的用户对象,该ViewModel从Firebase检索数据:

    userRetrievedData = userViewModel.user
视图模型:

let firstName = document.get("firstName") as? String ?? ""
self.user = Account(firstName: firstName)
以前我可以在第二个ViewController中检索数据,但现在它给了我一个错误

致命错误:在展开可选值:file时意外发现nil

在这一行中,我在第二个Viewcontroller中得到了错误,而第一个Viewcontroller中的同一行工作:

userRetrievedData.firstName! 
为什么在第二个ViewController而不是第一个ViewController中出现此错误

ViewController中的声明是相同的:

var userRetrievedData = User()
var userViewModel = UserViewModel()

你把物体从第一个传递到第二个吗?我会在第二个未初始化的控制器中使用可选变量,以便它从第一个控制器获得它

在第一个控制器中,您可以执行以下操作:

secondViewController.userRetrievedData = userRetrievedData
navigationController?.pushViewController(secondViewController, animated: true)
userRetrievedData?.firstName
在第二个控制器中

secondViewController.userRetrievedData = userRetrievedData
navigationController?.pushViewController(secondViewController, animated: true)
userRetrievedData?.firstName

您可以发布第二个ViewController的代码吗?您在哪里声明
userRetrievedData
对象?我在两个视图控制器的顶部声明,我编辑了我的代码。好的,看来问题在于您只在第一个视图控制器中初始化
userRetrievedData
,而不是在另一个视图控制器中初始化。在引用其属性之前,应该在第二个视图控制器中初始化实例。我在两个视图控制器中都有代码,所以这不是问题所在。用于调用viewmodel的声明和方法。我做了一个打字错误的ViewController而不是ViewModel现在编辑了这篇文章它和文章的最后一部分是一样的。只有当代码不是“ViewController内部的偏差”而是“ViewModel内部的偏差”时,代码才是针对ViewController的。我提到的代码是ViewController中的初始化代码。我通过将它从第一个ViewController传递到第二个ViewController使其工作。但是为什么我不能通过viewcontroller和firebase在第二个viewcontroller中再次检索数据,而只能通过第一个。而且可选部分不起作用,我必须使用感叹号!要使其正常工作,您可以这样做,如果这是您想要做的,但请记住,在您这边打电话以及用户为同一数据支付bandwith费用是有成本的。通常强制取消映射不是一个好主意,因为它会使应用程序崩溃,请尝试使用guard语句guard let firstName=userRetrievedData?.firstName else{}不,这种方式很好,但我只是想通过在不同的viewcontroller中再次调用数据来解释为什么它不起作用。我会用警卫声明试试