如何从数组中取值并在UIPageViewController中展示?
实现数组数据在UIPageViewController中展示的完整方案
我看你已经在搭建基于UIPageViewController的页面展示功能了,接下来我帮你把功能补全,让你能顺利从数组中取数据并展示对应的页面:
完整代码示例
import UIKit // 先定义一个用于展示内容的子页面控制器 class ContentViewController: UIViewController { // 用于接收数组传过来的数据 var displayText: String? override func viewDidLoad() { super.viewDidLoad() // 简单展示数据,你可以根据需求自定义UI let label = UILabel(frame: view.bounds) label.text = displayText label.textAlignment = .center label.font = UIFont.systemFont(ofSize: 24) view.addSubview(label) } } // 补全你原来的ViewController类 class ViewController: UIViewController, UIPageViewControllerDataSource { // MARK: - Variables // 存储要展示的数据源数组(可替换成你自己的模型数组) private let contentArray = ["页面1内容", "页面2内容", "页面3内容", "页面4内容"] // UIPageViewController实例 private var pageViewController: UIPageViewController? // 当前页面的索引 private var currentIndex = 0 override func viewDidLoad() { super.viewDidLoad() setupPageViewController() } // MARK: - 初始化PageViewController private func setupPageViewController() { // 创建UIPageViewController,设置滑动样式和方向 pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil) pageViewController?.dataSource = self // 设置初始展示的页面 if let firstVC = getViewController(at: 0) { pageViewController?.setViewControllers([firstVC], direction: .forward, animated: true, completion: nil) } // 将PageViewController添加到当前视图中 guard let pageVC = pageViewController else { return } addChild(pageVC) view.addSubview(pageVC.view) pageVC.view.frame = view.bounds pageVC.didMove(toParent: self) } // 根据索引从数组取数据,创建对应的内容控制器 private func getViewController(at index: Int) -> ContentViewController? { // 先判断索引是否在数组合法范围内,避免越界 guard index >= 0, index < contentArray.count else { return nil } let vc = ContentViewController() vc.displayText = contentArray[index] // 用tag标记当前控制器对应的索引,方便后续判断 vc.view.tag = index return vc } // MARK: - UIPageViewController数据源方法 func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { let currentTag = viewController.view.tag currentIndex = currentTag // 第一页没有前一页,直接返回nil guard currentIndex > 0 else { return nil } return getViewController(at: currentIndex - 1) } func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { let currentTag = viewController.view.tag currentIndex = currentTag // 最后一页没有后一页,直接返回nil guard currentIndex < contentArray.count - 1 else { return nil } return getViewController(at: currentIndex + 1) } // 若需要显示底部页面指示器,实现以下两个方法 func presentationCount(for pageViewController: UIPageViewController) -> Int { return contentArray.count } func presentationIndex(for pageViewController: UIPageViewController) -> Int { return currentIndex } }
关键部分说明
- 数据源数组:
contentArray是你要展示的核心数据集合,你可以替换成自定义的模型数组(比如包含图片、标题的PageModel),只要在getViewController方法中对应赋值给内容控制器即可。 - 内容控制器:
ContentViewController是每个滑动页面的载体,你可以完全自定义它的UI(比如添加图片视图、文本详情等),只需要保留接收数据的属性即可。 - 页面创建逻辑:
getViewController(at:)负责将数组索引和页面控制器绑定,同时通过view.tag标记索引,避免在数据源方法中额外存储状态。 - 边界处理:在
viewControllerBefore和viewControllerAfter方法中,通过判断当前索引是否在数组首尾,避免出现越界崩溃。 - 页面指示器:如果需要底部的小圆点指示器,必须实现
presentationCount和presentationIndex方法,前者返回总页数,后者返回当前页码。
这样你就能顺利实现从数组取数据,在UIPageViewController中左右滑动展示每个页面的功能啦~
内容的提问来源于stack exchange,提问作者abel
相关产品推荐
相关产品推荐

