Swift 将数据从ContainerView传递到UIPageViewController,然后再传递到';s连接的视图控制器

Swift 将数据从ContainerView传递到UIPageViewController,然后再传递到';s连接的视图控制器,swift,uipageviewcontroller,uicontainerview,Swift,Uipageviewcontroller,Uicontainerview,这几天我一直在想这个。我的目标是创建一个应用程序,该应用程序的容器视图连接到UIPageViewController,这样我就可以显示不同数据/视图的页面。(我现有的应用程序,带UITabBarController,带一个数据页/视图) 到目前为止,我已经创建了containerView和UIPageController,以及不同的ViewController,使用了来自此的指导,并浏览了许多So页面,但无法得到我想要的结果 在根VC(Train)中,我有: override func p

这几天我一直在想这个。我的目标是创建一个应用程序,该应用程序的容器视图连接到UIPageViewController,这样我就可以显示不同数据/视图的页面。(我现有的应用程序,带UITabBarController,带一个数据页/视图)

到目前为止,我已经创建了containerView和UIPageController,以及不同的ViewController,使用了来自此的指导,并浏览了许多So页面,但无法得到我想要的结果

在根VC(Train)中,我有:

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    print("VCTrain segue ID:\(String(describing: segue.identifier))\n")
    if (segue.identifier == "segueTrainContainerViewPages") {
      print("prepare for segueTrainContainerViewPages")
      let vcContainerView = segue.destination as! VCTrainContainerViewPages
      vcContainerView.myLabel = "HELLO"        // This gets Passed
      
      // workoutTitle is obtained from the LIBRARY tab once the user clicks 
      // on a row in the tableview. It is blank until user selects a workout Title
      vcContainerView.myLabel1 = workoutTitle  // This remains Blank
    }
  }
这是vctrainecontainerviewpage,它基本上是

导入UIKit
VCTrainContainerViewPages类:UIPageViewController、UIPageViewControllerDataSource、UIPageViewControllerDelegate{
变量页=[UIViewController]()
var myLabel=String()
var myLabel1=String()
重写func viewDidLoad(){
super.viewDidLoad()
self.delegate=self
self.dataSource=self
让page1:UIViewController!=情节提要?.InstanceEviewController(标识符为:“id1”)
让page2:UIViewController!=情节提要?.InstanceEviewController(带标识符:“id2”)
让page3:UIViewController!=情节提要?.InstanceEviewController(带标识符:“id3”)
pages.append(第1页)
pages.append(第2页)
第页。追加(第3页)
SetViewController([page1],方向:UIPageViewController.NavigationDirection.forward,动画:false,完成:nil)
打印(“\nVCTrainContainerViewPages VDL myLabel:\(myLabel)”)
打印(“VCTrainContainerViewPages VDL myLabel1:\(myLabel1)\n”)
}
覆盖函数视图显示(u动画:Bool){
}
func pageViewController(uPageViewController:UIPageViewController,viewController在viewController:UIViewController之前)->UIViewController{
让cur=pages.firstIndex(of:viewController)!
var prev=(cur-1)%pages.count
如果prev<0{
上一页=页数。计数-1
}
返回页[上一页]
}
func pageViewController(pageViewController:UIPageViewController,viewController后的viewController:UIViewController)->UIViewController{
让cur=pages.firstIndex(of:viewController)!
设nxt=abs((cur+1)%pages.count)
返回页[nxt]
}
func presentationIndex(对于pageViewController:UIPageViewController)->Int{
返回页数.count
}
}
目前有效的方法:

  • UIPageViewController工作(滑动工作,所有3个视图控制器移动)
  • MyLabel从MainVC传递到UIPageViewController(列车容器视图页面)
  • 我需要做什么

  • “库”选项卡中的训练标题。这将从“库”选项卡(一旦用户选择训练)传递到“训练”选项卡,然后传递到“训练容器视图”页面
  • 根VC(列车)中的prepare for Segue函数仅在列车页面的初始加载期间调用1x。此页面的后续加载不再调用prepareForSegue


    在工作场景(不带容器视图/UIPageController)中,我使用ViewDidAspect接收从LIBRARY选项卡传递的数据。是否可以使用ViewDidAppeal传递数据?

    是否可以显示代码,其中“当用户单击tableview中的一行时,将从库选项卡中获取workoutTitle。在用户选择一个训练标题之前,该代码为空”仅当您触发segue时才会调用“准备”。我知道这是你第一次点击“train”。@claude31“Workoutitle from LIBRARY Tab”的代码几乎所有我阅读的教程都使用prepare for segue作为传递数据的方式,因此我尝试了这一点。感谢您的帮助。您是否可以显示代码,其中“当用户单击tableview中的某一行时,workoutTitle将从LIBRARY选项卡中获取。在用户选择训练标题之前,该代码为空”仅当您触发segue时才调用“Prepare”。我知道这是你第一次点击“train”。@claude31“Workoutitle from LIBRARY Tab”的代码几乎所有我阅读的教程都使用prepare for segue作为传递数据的方式,因此我尝试了这一点。谢谢你的帮助
    import UIKit
    
    class VCTrainContainerViewPages: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
      
      var pages = [UIViewController]()
      var myLabel = String()
      var myLabel1 = String()
    
      override func viewDidLoad() {
        super.viewDidLoad()
        
        self.delegate = self
        self.dataSource = self
        
        let page1: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "id1")
        let page2: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "id2")
        let page3: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "id3")
        
        pages.append(page1)
        pages.append(page2)
        pages.append(page3)
        
        setViewControllers([page1], direction: UIPageViewController.NavigationDirection.forward, animated: false, completion: nil)
        
        print("\nVCTrainContainerViewPages VDL myLabel :\(myLabel)")
        print("VCTrainContainerViewPages VDL myLabel1:\(myLabel1)\n")
      }
      
      override func viewDidAppear(_ animated: Bool) {
        
      }
       
      
      func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController)-> UIViewController? {
        
        let cur = pages.firstIndex(of: viewController)!
        
        var prev = (cur - 1) % pages.count
        if prev < 0 {
          prev = pages.count - 1
        }
        return pages[prev]
      }
      
      func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController)-> UIViewController? {
        
        let cur = pages.firstIndex(of: viewController)!
        
        let nxt = abs((cur + 1) % pages.count)
        return pages[nxt]
      }
      
      func presentationIndex(for pageViewController: UIPageViewController)-> Int {
        return pages.count
      }
    }