内部带有导航控制器的 PageViewController

PageViewController with Navigation Controllers Inside

我有一个 pageviewcontroller,我想在其中包含多个导航控制器。我保留错误类型 HomeViewController does not conform to UIPageViewController DataSource。

import UIKit
import Firebase
import FirebaseAuth

class HomeViewController: UIPageViewController, UIPageViewControllerDataSource {
    let dropDownLauncher = DropDownLauncher()
        override func viewDidLoad() {
            super.viewDidLoad()
            self.dataSource = self
            if let firstViewController = viewControllerList.first{
                self.setViewControllers([firstViewController], direction: .forward, animated: true, completion: nil)
            }
            // setupView()
        }
    lazy var viewControllerList: [UINavigationController] = {
        let layout = UICollectionViewFlowLayout()
        let homeFeedController = HomeFeedController(collectionViewLayout: layout)
        let navController = UINavigationController(rootViewController: homeFeedController)
        let profileView = ProfileeViewController(collectionViewLayout: layout)
        let profileViewNavController = UINavigationController(rootViewController: profileView)
        let searchController = EventSearchController(collectionViewLayout: layout)
        let searchNavController = UINavigationController(rootViewController: searchController)

        return [navController,profileViewNavController,searchNavController]
    }()

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UINavigationController) -> UINavigationController? {
        guard let vcIndex = viewControllerList.index(of: viewController) else{
            return nil
        }
        let previousIndex = vcIndex - 1
        guard previousIndex >= 0 else {
            return nil
        }
        guard viewControllerList.count > previousIndex else{
            return nil
        }
        return viewControllerList[previousIndex]
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UINavigationController) -> UINavigationController? {

        guard let vcIndex = viewControllerList.index(of: viewController) else{
            return nil
        }
        let nextIndex = vcIndex + 1
        guard viewControllerList.count != nextIndex else{
            return nil
        }
        guard viewControllerList.count > nextIndex else{
            return nil
        }

        return viewControllerList[nextIndex]
        }

}

所以我的问题是。 有没有办法有效地做到这一点并消除这个错误? 有没有办法控制哪个视图控制器以什么顺序出现? 因为我希望它们出现的顺序是一定的

因为你有一个看起来不会改变的静态视图控制器列表,你应该能够取消符合 UIPageControllerDataSource 并简单地在 viewDidLoad() 中使用 setViewControllers(_:direction:animated:completion:)

override func viewDidLoad() {
    super.viewDidLoad()
    self.dataSource = self
    self.setViewControllers(self.viewControllerList, direction: .forward, animated: true, completion: nil)
}

https://developer.apple.com/documentation/uikit/uipageviewcontroller/1614087-setviewcontrollers

您可能需要将 viewControllerList 的类型更改为 [UIViewController]

这也意味着您可以完全删除您的方法:

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UINavigationController) -> UINavigationController?

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UINavigationController) -> UINavigationController? {

如果您确实想要符合 UIPageControllerDataSource,则方法签名必须完全符合要求:

func pageViewController(_ pageViewController: UIPageViewController, 
viewControllerBefore viewController: UIViewController) -> UIViewController?

func pageViewController(_ pageViewController: UIPageViewController, 
viewControllerAfter viewController: UIViewController) -> UIViewController?

幸运的是,由于 UINavigationController 是 UIViewController 的子类,您的其余代码应该可以正常工作。

视图控制器的顺序将与它们在从 viewControllerList

返回的数组中的顺序相同