无法将 autoID 传递给新的 VC

Posted

技术标签:

【中文标题】无法将 autoID 传递给新的 VC【英文标题】:can't pass autoID to new VC 【发布时间】:2020-04-09 11:00:52 【问题描述】:

我正在尝试将收到的 autoID 传递给另一个 ViewController... 我得到这样的 ID:

var passID: String = ""

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

    jobsRef.queryOrdered(byChild: "userID").queryEqual(toValue: userID).observe(.childAdded, with: snapshot in
        let currentPostID = snapshot.key
        self.passID = currentPostID
        print(self.passID) //-> Here the ID gets printed correctly
    )
    performSegue(withIdentifier: "toJobDetail", sender: indexPath)

我的 Segue 本身是这样的:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "toJobDetail" 
        if let indexPath = sender as? IndexPath, let nextVC = segue.destination as? MyProfileJobDetailViewController 
            nextVC.jobDetails = MyProfileJobDetailViewController.JobDetails(IDPassed: self.passID)
   

我尝试像这样在 New VC 中打印 ID:

var jobDetails: JobDetails?
struct JobDetails 
    var IDPassed: String


override func viewDidLoad() 
    super.viewDidLoad()
    print(jobDetails?.IDPassed) -> ID won't get printed correctly 
 

但我现在的输出只有:

可选(())

我在传递 ID 时做错了吗? 因为在选择单元格时打印 ID 是可行的......

编辑:

我现在正在获取 ID,因为我只是在 Firebase 查询中调用 performSegue:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    jobsRef.queryOrdered(byChild: "userID").queryEqual(toValue: userID).observe(.childAdded, with: snapshot in
        let currentPostID = snapshot.key
        self.passID = currentPostID
        print(self.passID)
        self.performSegue(withIdentifier: "toJobDetail", sender: indexPath)
    )

【问题讨论】:

你可以尝试删除结构并声明一个简单的 var 变量并赋值。我认为这将解决您的问题 【参考方案1】:

您的查询是异步的并且需要一些时间,您应该确保在转到下一个屏幕之前获得所需的值。试试这个。。

jobsRef.queryOrdered(byChild: "userID").queryEqual(toValue: userID).observe(.childAdded, with: snapshot in
    let currentPostID = snapshot.key
    self.passID = currentPostID
    print(self.passID) //-> Here the ID gets printed correctly
    performSegue(withIdentifier: "toJobDetail", sender: indexPath)
)

编辑:

试试看……

var jobDetails: JobDetails? 
   didSet 
      print("set jobDetails to \(jobDetails)"
   


override func viewDidLoad() 
    super.viewDidLoad()
    print("viewDidLoad: \(jobDetails?.IDPassed)")
 

【讨论】:

感谢您的回答 - 遗憾的是,现在我得到 Optional("") 作为输出...我可能需要在第二个 vc 上进行更改吗? 我已经进行了编辑,你可以在你的第二个视图控制器中尝试一下,并让我知道 hte 输出 试用了您编辑的解决方案并获得 viewDidLoad: Optional("")Optional("") 作为输出 viewDidLoad 在您设置值之前被调用。因此视图正在加载 prepareForSegure 并且您正在打印出空值。在 prepareForSegue 的下一行中,您正在设置值。在属性上使用 viewWillAppear 或 didSet 可能会更好 好的,我做了一些全新的事情(检查我更新的代码) - 我得到了想要传递的 ID,但只在 Optional 后面,所以我的输出看起来像 Optional("ID") - 有没有办法删除 Optional 部分?

以上是关于无法将 autoID 传递给新的 VC的主要内容,如果未能解决你的问题,请参考以下文章

将蓝牙连接传递给新的 Activity

如何将 DataTable.Select() 结果传递给新的 DataTable?

将套接字传递给新的 AppDomain

如何将特定的 ListTile 变量传递给新的页面路由 onTap?

将 log4net 配置文件传递给新的 AppDomain

我无法将数据从一个 VC 传递到另一个 [重复]