【问题标题】:Pass variable from UIPageViewController to UIViewController child将变量从 UIPageViewController 传递给 UIViewController 子
【发布时间】:2019-10-31 21:43:58
【问题描述】:

我正在尝试为我的应用创建教程/介绍,由于此时我不确定它会有多少页,所以我决定使用 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)
            }
        }
    }
}

我一直在寻找解决方案,我找到了这些:

PageViewController pass data to child controller

Passing data between UIPageViewController Child views with Swift

PageViewController - Pass variables to child views

how to pass data from UIPageViewController to child ViewController using delegates

我知道这是一个常见问题,但不幸的是,我找到的解决方案都没有为我工作,我不明白为什么以及我缺少什么。

有什么想法吗?

【问题讨论】:

    标签: swift parent-child uipageviewcontroller pass-data


    【解决方案1】:

    替换

    return pagesArray[previousIndex]
    

    与

    let item =  pagesArray[previousIndex]
    item.index = previousIndex
    return item
    

    等下一个


    class VCInstance:UIViewController {
       var index:Int!
    }
    

    还有

    lazy var pagesArray : [UIViewController] =
    

    与

    lazy var pagesArray : [VCInstance] =
    

    【讨论】:

    • 当用您的建议替换 return pagesArray[previousIndex] 时,我得到“无法赋值:'index' 是一种方法”。
    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多