You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从数组中取值并在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:28:41