Swift 将变量从UIPageViewController传递到UIViewController子级

Swift 将变量从UIPageViewController传递到UIViewController子级,swift,parent-child,uipageviewcontroller,pass-data,Swift,Parent Child,Uipageviewcontroller,Pass Data,我正在尝试为我的应用程序创建一个教程/介绍,因为现在我不确定有多少页,所以我决定使用一个UIPageViewController和一个孩子 我的意图是将我想要显示的所有数据存储在一个对象数组中,并使用UIPageViewController中当前显示视图的索引从该数组中获取我需要的对象 override func viewWillAppear(_ animated: Bool) { print("PageContentVC > viewWillAppear") ivPa

我正在尝试为我的应用程序创建一个教程/介绍,因为现在我不确定有多少页,所以我决定使用一个UIPageViewController和一个孩子

我的意图是将我想要显示的所有数据存储在一个对象数组中,并使用UIPageViewController中当前显示视图的索引从该数组中获取我需要的对象

override func viewWillAppear(_ animated: Bool)
{
    print("PageContentVC > viewWillAppear")

    ivPageContent.image = UIImage(named: DataSingleton.sharedInstance.returnTutorialVCContent()[contentPage].contentImage!)
    lblPageContentTitle.text = DataSingleton.sharedInstance.returnTutorialVCContent()[contentPage].contentLabel!
    lblPageContentText.text = DataSingleton.sharedInstance.returnTutorialVCContent()[contentPage].contentText!
}
为此,我需要将该索引从UIPageViewController传递给它的子级ContentPageVC。 我在获取索引方面没有问题,但我很难将其传递给ContentPageVC

import UIKit

class TutorialPageVC : UIPageViewController,
    UIPageViewControllerDataSource,
    UIPageViewControllerDelegate
{
    /*
    // MARK: - Variables & Constants
    */

    var contentPage : Int = 0
    var collectionViewPageControl : UIPageControl = UIPageControl()

    lazy var pagesArray : [UIViewController] =
    {
        return [self.VCInstance(name: "pageContent"),
                self.VCInstance(name: "pageContent"),
                self.VCInstance(name: "pageContent"),
                self.VCInstance(name: "pageContent"),
                self.VCInstance(name: "pageContent"),
                self.VCInstance(name: "pageContent"),
                self.VCInstance(name: "pageContent"),
                self.VCInstance(name: "pageContent"),
                self.VCInstance(name: "pageContent")]
    }()

    private func VCInstance(name: String) -> UIViewController
    {
        return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name)
    }


    /*
    // MARK: - VC Status
    */

    override func viewDidLoad()
    {
        super.viewDidLoad()

        print("TutorialPageVC > viewDidLoad")

        self.dataSource = self
        self.delegate = self

        if let firstVC = pagesArray.first
        {
            setViewControllers([firstVC], direction: .forward, animated: true, completion: nil)
        }

        let pageControl = UIPageControl.appearance()
        pageControl.currentPageIndicatorTintColor = UIColor.activeColor
        pageControl.pageIndicatorTintColor = UIColor.backgroundColor
        self.view.backgroundColor = UIColor.clear
    }

    override func viewDidLayoutSubviews()
    {
        super.viewDidLayoutSubviews()

        print("TutorialPageVC > viewDidLayoutSubviews")

        for view in self.view.subviews
        {
            if view is UIScrollView { view.frame = UIScreen.main.bounds }
        }
    }

    /*
    // MARK: - UIPageViewController Delegates
    */

    public func pageViewController(_ pageViewController: UIPageViewController,
                                   viewControllerBefore viewController: UIViewController) -> UIViewController?
    {
        print("TutorialPageVC > pageViewController > viewControllerBefore")

        guard let viewControllerIndex = pagesArray.firstIndex(of: viewController) else { return nil }

        let previousIndex = viewControllerIndex - 1

        guard previousIndex >= 0 else { return pagesArray.last }
        guard pagesArray.count > previousIndex else { return nil }

        return pagesArray[previousIndex]
    }

    public func pageViewController(_ pageViewController: UIPageViewController,
                                   viewControllerAfter viewController: UIViewController) -> UIViewController?
    {
        print("TutorialPageVC > pageViewController > viewControllerAfter")

        guard let viewControllerIndex = pagesArray.firstIndex(of: viewController) else { return nil }

        let nextIndex = viewControllerIndex + 1

        guard nextIndex < pagesArray.count else { return pagesArray.first }
        guard pagesArray.count > nextIndex else { return nil }

        return pagesArray[nextIndex]
    }

    public func presentationCount(for pageViewController: UIPageViewController) -> Int
    {
        print("TutorialPageVC > presentationCount")

        return pagesArray.count
    }

    public func presentationIndex(for pageViewController: UIPageViewController) -> Int
    {
        print("TutorialPageVC > presentationIndex")

        guard let firstViewController = viewControllers?.first,
              let firstViewControllerIndex = pagesArray.firstIndex(of: firstViewController) else
        {
            return 0
        }

        return firstViewControllerIndex
    }

    public func pageViewController(_ pageViewController: UIPageViewController,
                                   willTransitionTo pendingViewControllers: [UIViewController])
    {
        print("TutorialPageVC > pageViewController > willTransitionTo")
    }

    public func pageViewController(_ pageViewController: UIPageViewController,
                                   didFinishAnimating finished: Bool,
                                   previousViewControllers: [UIViewController],
                                   transitionCompleted completed: Bool)
    {
        print("TutorialPageVC > pageViewController > didFinishAnimating")

        if completed
        {
            if let currentViewController = pageViewController.viewControllers?.first,
               let index = pagesArray.firstIndex(of: currentViewController)
            {
                contentPage = index
                print(contentPage)
            }
        }
    }
}
导入UIKit
类教程页面VC:UIPageViewController,
UIPageViewControllerDataSource,
UIPageViewControllerDelegate
{
/*
//标记:-变量和常量
*/
var contentPage:Int=0
var collectionViewPageControl:UIPageControl=UIPageControl()
lazy var pagesArray:[UIViewController]=
{
返回[self.VCInstance(名称:“pageContent”),
self.VCInstance(名称:“pageContent”),
self.VCInstance(名称:“pageContent”),
self.VCInstance(名称:“pageContent”),
self.VCInstance(名称:“pageContent”),
self.VCInstance(名称:“pageContent”),
self.VCInstance(名称:“pageContent”),
self.VCInstance(名称:“pageContent”),
self.VCInstance(名称:“pageContent”)]
}()
private func VCInstance(名称:String)->UIViewController
{
返回UIStoryboard(名称:“Main”,捆绑包:nil)
}
/*
//MARK:-VC状态
*/
重写func viewDidLoad()
{
super.viewDidLoad()
打印(“教程页面VC>viewDidLoad”)
self.dataSource=self
self.delegate=self
如果让firstVC=pagesArray.first
{
SetViewController([firstVC],方向:。正向,动画:true,完成:nil)
}
让pageControl=UIPageControl.appearance()
pageControl.currentPageIndicatorTintColor=UIColor.activeColor
pageControl.pageIndicatorTintColor=UIColor.backgroundColor
self.view.backgroundColor=UIColor.clear
}
重写func viewdilayoutsubviews()
{
super.viewDidLayoutSubviews()
打印(“教程页面VC>viewDidLayoutSubviews”)
用于在self.view.subview中查看
{
如果视图为UIScrollView{view.frame=UIScreen.main.bounds}
}
}
/*
//标记:-UIPageViewController委托
*/
公共函数pageViewController(uPageViewController:UIPageViewController,
ViewControllerBeforeViewController:UIViewController)->UIViewController?
{
打印(“教程页面VC>pageViewController>viewControllerBefore”)
guard let viewControllerIndex=pagesArray.firstIndex(of:viewController)else{return nil}
让previousIndex=viewControllerIndex-1
guard previousIndex>=0 else{return pagesArray.last}
guard pagesArray.count>previousIndex else{return nil}
返回页数组[以前的索引]
}
公共函数pageViewController(uPageViewController:UIPageViewController,
viewControllerAfter viewController:UIViewController)->UIViewController?
{
打印(“教程页面VC>pageViewController>viewControllerAfter”)
guard let viewControllerIndex=pagesArray.firstIndex(of:viewController)else{return nil}
设nextIndex=viewControllerIndex+1
guard nextIndexnextIndex else{return nil}
返回页面array[nextIndex]
}
public func presentationCount(对于pageViewController:UIPageViewController)->Int
{
打印(“教程页面VC>presentationCount”)
return pagesArray.count
}
公共函数表示索引(对于pageViewController:UIPageViewController)->Int
{
打印(“教程页面VC>presentationIndex”)
guard let firstViewController=ViewController?首先,
让firstViewControllerIndex=pagesArray.firstIndex(of:firstViewController)else
{
返回0
}
返回firstViewControllerIndex
}
公共函数pageViewController(uPageViewController:UIPageViewController,
将转换到PendingViewController:[UIViewController])
{
打印(“教程页面VC>pageViewController>WillTransitiono”)
}
公共函数pageViewController(uPageViewController:UIPageViewController,
完成了:布尔,
PreviousViewController:[UIViewController],
过渡已完成:Bool)
{
打印(“教程页面VC>pageViewController>didFinishAnimating”)
如果完成
{
如果先让currentViewController=pageViewController.ViewController,
让index=pagesArray.firstIndex(of:currentViewController)
{
contentPage=索引
打印(内容页)
}
}
}
}
我已经寻找了一段时间的解决方案,我发现:

我知道这是一个常见的问题,但不幸的是,我找到的解决方案中没有一个对我有效,我也不知道为什么,我遗漏了什么

有什么想法吗?

替换

return pagesArray[previousIndex]

等等,下一个



当用您建议的内容替换返回页数组[previousIndex]时,我得到“无法赋值:'索引'是一种方法”。
let item =  pagesArray[previousIndex]
item.index = previousIndex
return item
class VCInstance:UIViewController {
   var index:Int!
}
lazy var pagesArray : [UIViewController] =
lazy var pagesArray : [VCInstance] =