如何从UIPageViewController打开视图并返回至指定页面
解决从项目选择页返回UIPageViewController第二页的方案
嘿,这个场景我熟!核心逻辑其实很简单:记住你离开时的页面索引,等操作完成后,让UIPageViewController主动切换回那个页面就行。下面分两种最常见的跳转场景给你具体实现步骤:
场景1:用UINavigationController Push跳转过去
这种情况是最常见的,假设你的UIPageViewController是导航栈的根控制器,教程页面是它的子ViewController。
第一步:给UIPageViewController加个当前索引的属性
先在你的TutorialPageViewController里维护当前显示的页面索引,方便后续调用:
class TutorialPageViewController: UIPageViewController { // 存储所有教程页面的数组 var tutorialVCs: [UIViewController] = [] // 当前显示的页面索引(从0开始,第二页就是1) var currentIndex: Int = 0 override func viewDidLoad() { super.viewDidLoad() dataSource = self delegate = self // 这里初始化你的tutorialVCs数组,比如加载三个教程页 tutorialVCs = [FirstTutorialVC(), SecondTutorialVC(), ThirdTutorialVC()] setViewControllers([tutorialVCs[0]], direction: .forward, animated: false) } } // 实现代理,更新currentIndex extension TutorialPageViewController: UIPageViewControllerDelegate { func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { guard completed, let currentVC = pageViewController.viewControllers?.first, let index = tutorialVCs.firstIndex(of: currentVC) else { return } currentIndex = index } }
第二步:跳转时传递目标返回索引
在第二页的教程VC(比如SecondTutorialVC)里,点击按钮跳转时,把要返回的索引(1)传给项目选择页:
class SecondTutorialVC: UIViewController { @IBAction func goToProjectSelection(_ sender: UIButton) { let tableVC = ProjectSelectionTableViewController() // 告诉它返回后要回到第2页(索引1) tableVC.returnToIndex = 1 navigationController?.pushViewController(tableVC, animated: true) } }
第三步:完成操作后返回并切换页面
在项目选择页(ProjectSelectionTableViewController)里,完成选择后,回到导航栈并让UIPageViewController切换到目标页:
class ProjectSelectionTableViewController: UITableViewController { var returnToIndex: Int = 0 @IBAction func confirmSelection(_ sender: UIButton) { // 先回到上一个页面 navigationController?.popViewController(animated: true) // 获取导航栈里的UIPageViewController实例 guard let tutorialPageVC = navigationController?.viewControllers.first as? TutorialPageViewController else { return } // 切换到第二页 let targetVC = tutorialPageVC.tutorialVCs[returnToIndex] tutorialPageVC.setViewControllers([targetVC], direction: .forward, animated: true, completion: nil) // 更新currentIndex tutorialPageVC.currentIndex = returnToIndex } }
场景2:用模态Present弹出项目选择页
如果你的项目选择页是模态弹出的,那用闭包来通知返回会更灵活:
第一步:给项目选择页加个回调闭包
class ProjectSelectionTableViewController: UITableViewController { // 定义回调,参数是要返回的页面索引 var onDismiss: ((Int) -> Void)? @IBAction func confirmSelection(_ sender: UIButton) { // 先 dismiss 页面,完成后触发回调 dismiss(animated: true) { self.onDismiss?(1) // 1是第二页的索引 } } }
第二步:弹出时设置回调
在第二页的教程VC里,弹出页面时绑定回调,告诉UIPageViewController切换页面:
class SecondTutorialVC: UIViewController { @IBAction func goToProjectSelection(_ sender: UIButton) { let tableVC = ProjectSelectionTableViewController() tableVC.onDismiss = { [weak self] targetIndex in // 避免强引用,用weak self guard let tutorialPageVC = self?.navigationController?.viewControllers.first as? TutorialPageViewController else { return } let targetVC = tutorialPageVC.tutorialVCs[targetIndex] tutorialPageVC.setViewControllers([targetVC], direction: .forward, animated: true, completion: nil) tutorialPageVC.currentIndex = targetIndex } present(tableVC, animated: true) } }
关键注意点
- 不管哪种方式,都要确保能正确获取到
TutorialPageViewController的实例,用导航栈的viewControllers.first或者parent(如果结构允许)都可以 - 闭包一定要用
weak self,避免内存泄漏 - 如果是用Storyboard创建的VC,记得给VC设置标识符,用
instantiateViewController(withIdentifier:)来实例化,而不是直接初始化
内容的提问来源于stack exchange,提问作者NickM
相关产品推荐
相关产品推荐

