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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:14:59