程序化嵌入 segue

Posted

技术标签:

【中文标题】程序化嵌入 segue【英文标题】:Programmatic embed segue 【发布时间】:2017-04-08 11:20:27 【问题描述】:

我正在使用页面视图控制器在我的应用程序中实现图像轮播。我的父视图控制器中有一个容器视图,它有一个嵌入到页面视图控制器的 segue。我遇到的问题是当我需要异步获取这些图像时,segue 发生在 viewDidLoad 获取图像之前。

我为转会做准备:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
  if segue.identifier == "startCarousel" 
    let carouselPageViewController = segue.destination as! CarouselPageViewController
    carouselPageViewController.images = carouselImages
  

在 viewDidLoad 中:

GalleryManager.sharedInstance.getData = 
  (data) in
  // Assign images to instance property here ...      

我的想法是,一旦获得图像,我就可以自己以编程方式启动 segue。或者,如果我应该以不同的方式这样做,任何建议都会非常感激。

【问题讨论】:

在嵌入式视图控制器中获取图像,而不是在嵌入式视图控制器中获取图像,或者保留对嵌入式视图控制器的引用并在拥有它们后更新图像属性。 我同意 @Paulw11 的观点,或者您可以将 getData 函数移到 viewWillAppear 或 viewDidAppear 中,这样函数在加载图像时不会导致延迟。 【参考方案1】:

您可以执行类似的操作,在 shouldPerformSegue 中返回 false 并在加载数据时启动 segue 即

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool 
    if identifier  == "startCarousel" 
        return (detail != nil)
    

    return  true

然后在viewDidLoad

GalleryManager.sharedInstance.getData =  [weak self] 
  (data) in
     self?.performSegue(withIdentifier: "startCarousel", sender: nil)

【讨论】:

【参考方案2】:

不,您不能延迟嵌入转场。如果您使用嵌入 segue,它会在视图控制器加载后立即触发。

您需要等到数据加载完毕,然后调用setViewControllers(direction:animated:completion) 来安装视图控制器,以便在加载数据后显示数据。

【讨论】:

【参考方案3】:

Swift 3、Xcode 8

你可以这样实现:

    在您的 masterViewController 中的 prepareForSegue 中设置对您的页面视图控制器的引用:

    var myContainerViewController: UIPageViewController?
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    
       if segue.identifier == "embedSegue" 
         if let destination = segue.destination as? YourPageViewControllerClass 
           self.myContainerViewController = destination
        
    
    

    在你自己的 pageViewController 类中定义一个函数:

    func someFunction()
      //configure your image or swipe page
    
    

    当您获取图像时,在您的 masterViewController 调用中:

    self.myContainerViewController?.someFunction()
    

【讨论】:

【参考方案4】:

您不能延迟嵌入转场。

您尝试将按钮放在视图控制器中,然后在视图加载设置按钮后单击以设置图像...

【讨论】:

以上是关于程序化嵌入 segue的主要内容,如果未能解决你的问题,请参考以下文章

代表为零,使用故事板嵌入segue

在 Swift 中为嵌入式 tableView 中的 segue 做准备

在 UITableView 中嵌入的自定义 UICollectionView 中执行 Segue

模态segue推动顶部的附加导航栏滑动

从弹出ViewController Swift看

具有多个嵌入 segues 的 ContainerView