UIPageViewController滚动转场样式下代理方法未调用问题求助
解决UIPageViewController垂直滚动转场时代理方法未调用的问题
我之前也碰到过类似的情况,给你几个具体的排查和解决方向:
1. 确保代理对象的生命周期正常
首先检查持有UIPageViewController的对象(也就是你的self)是否被提前释放了。如果self被销毁,代理指针就会变成野指针,自然不会触发代理方法。
- 确认
_pageViewController是强引用(你的懒加载代码里已经是强引用,这部分没问题); - 确认
self的生命周期至少和pageViewController一样长,比如如果是把pageVC作为子控制器添加,要确保父控制器没有被提前释放。
2. 检查代理方法的签名是否完全正确
UIPageViewController的滚动转场对应的核心代理方法是:
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray<UIViewController *> *)previousViewControllers transitionCompleted:(BOOL)completed;
一定要确保方法的参数类型、顺序完全匹配,哪怕是一个小错误(比如把BOOL写成BOOL*)都会导致方法不被调用。可以直接从官方文档里复制方法签名来避免拼写错误。
3. 必须实现UIPageViewControllerDataSource的核心方法
如果没有实现数据源方法,UIPageViewController无法知道前后页面的内容,滚动交互会被禁用,代理方法自然不会触发。你需要实现这两个方法:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { // 返回当前控制器的前一个控制器,没有则返回nil NSInteger currentIndex = [self.dataSourceArray indexOfObject:viewController]; if (currentIndex <= 0) { return nil; } return [self createViewControllerWithIndex:currentIndex - 1]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { // 返回当前控制器的后一个控制器,没有则返回nil NSInteger currentIndex = [self.dataSourceArray indexOfObject:viewController]; if (currentIndex >= self.dataSourceArray.count - 1) { return nil; } return [self createViewControllerWithIndex:currentIndex + 1]; }
别忘了设置dataSource:
_pageViewController.dataSource = self;
4. 确认pageViewController的View已正确添加并布局
如果pageViewController.view没有被添加到父视图,或者布局约束不正确导致它的可交互区域为0,滚动操作无法被识别:
// 确保把pageVC的view添加到父视图,并设置正确的约束 [self.view addSubview:_pageViewController.view]; [_pageViewController.view setFrame:self.view.bounds]; // 别忘了添加子控制器 [self addChildViewController:_pageViewController]; [_pageViewController didMoveToParentViewController:self];
5. 排查手势冲突问题
如果你的页面中有其他自定义手势(比如UIScrollView的手势、自定义的Pan手势),可能会和UIPageViewController的滚动手势冲突,导致转场无法触发。可以暂时移除其他手势,测试代理方法是否正常调用,再逐步排查冲突的手势。
内容的提问来源于stack exchange,提问作者SamirChen
相关产品推荐
相关产品推荐

