内部带有导航控制器的 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
返回的数组中的顺序相同
我有一个 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