如何在将数据推送到导航堆栈之前将数据传递给视图控制器并加载它?

Posted

技术标签:

【中文标题】如何在将数据推送到导航堆栈之前将数据传递给视图控制器并加载它?【英文标题】:How can I pass data to a viewcontroller and load it before pushing it onto Navigation stack? 【发布时间】:2016-12-03 23:19:46 【问题描述】:

我有一个带有集合视图的视图控制器,当我单击一个单元格时,我将一个变量传递给另一个视图控制器,然后将其推送到导航堆栈上。

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
     self.performSegueWithIdentifier("nextVC", sender: self.userArray[indexPath.row])

这就是我发送变量的方式:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
     super.prepareForSegue(segue, sender: sender)
     let nextVC = segue.destinationViewController as! NextVC
     if let senderId = sender!.objectForKey("uId") 
          nextVC.userId = senderId as! String
     

下一个视图控制器(nextVC)有很多东西。我已经尽我所能来优化它,但加载所有东西仍然需要一些时间。有没有办法我可以为 segue 做准备,传递变量,让下一个 vc 做它的事情,然后当它完成加载时,实际上 segue 到它? (或展示它)?我看到其他一些关于预加载视图控制器的问题,但没有一个涉及传递变量。这个变量非常重要,因为 nextVC 中的所有内容都必须知道这个变量(基于所触摸的单元格),否则它将无法加载。我希望我解释得足够好,感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

如果您访问destinationViewControllerview 属性,它将触发view 加载。由于您实际上并不需要 view,因此只需将其分配给 _ 以使编译器满意。

试试这个:

 if let senderId = sender!.objectForKey("uId") 
      nextVC.userId = senderId as! String
      _ = nextVC.view
 

这将触发viewDidLoad 在segue 发生之前运行。确保您设置 NextVC 的代码位于 viewDidLoad 中,您应该一切顺利。

【讨论】:

是的,但它不会马上继续吗?没有时间加载? 除非您在后台线程中加载内容,否则我认为视图将在 _ = nextVC.view 完成后加载,即在 segue 发生之前。你试过了吗? 是的,没什么不同 是的,viewDidAppear 在 segue 之后才会发生。你能把那个代码移到viewDidLoad吗? 很高兴能帮上忙!

以上是关于如何在将数据推送到导航堆栈之前将数据传递给视图控制器并加载它?的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 在将 3 个视图推送到堆栈后崩溃

使用 Storyboard Segue iOS 将数据传递给视图控制器

如何将数据传递给 ASP.NET MVC 中的模式视图

如何将数据传递给其他视图? [关闭]

如何将数据传递给嵌套控制器(UIContainerView)?

如何检查视图控制器是不是以模态方式呈现或推送到导航堆栈上?