代码之家  ›  专栏  ›  技术社区  ›  Ron Baker

内部带有导航控制器的PageViewController

  •  1
  • Ron Baker  · 技术社区  · 7 年前

    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]
            }
    
    }
    

    有没有办法有效地做到这一点并消除这个错误? 因为我希望它们出现的顺序是确定的

    1 回复  |  直到 7 年前
        1
  •  0
  •   swift taylor    7 年前

    UIPageControllerDataSource 并简单使用 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的一个子类,其余代码应该可以工作。

    视图控制器的顺序将与数组中从返回的顺序相同