5

在我的应用程序中,我有一个RootViewController(UIPageViewController),一个FirstController(UIViewController)和一个SecondController(UIViewController)。 两个视图内的两个UIViewControllers滚动RootViewControllerUIPageViewController委托方法不被调用

在我RootViewController.h:

@interface RootController : UIPageViewController <UIPageViewControllerDataSource, UIPageViewControllerDelegate> 

但是,当我不同意见的委托方法之间滚动,如:

-(void) pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 

不叫。 为什么?有人能帮我吗?先谢谢你。

回答

22

是否指定RootViewController的(取控制器/对象要接收委托调用)是UIPageViewController的委托/数据源?

pageViewController.delegate = rootViewController; 
pageViewController.dataSource = rootViewController; 
1

您是如何连接页面视图控制器的代理插座?我的猜测是,你从来没有连接委托链接。

很奇怪有一个页面视图控制器是它自己的数据源和委托。我从来没有试图这样做,因为你正在做,而且我不确定它会起作用。我总是建立一个容器视图控制器来管理页面视图控制器。通过故事板,您只需在IB中设置容器视图并连接嵌入式Segue。然后,您将使容器视图控制器成为数据源和/或委托。

+0

我只是做了一些测试,因为我有页面视图控制器是它自己的dataSource。如果你尝试在viewDidLoad中设置dataSource,你的委托方法将永远不会被调用。但是,如果在调用super init方法后执行自己的init并设置dataSource,则会调用委托方法。我不喜欢重写init,所以我会切换到容器视图策略,但认为我会让其他人知道这是一种解决方法 –

5

除了上述明显的解决方案之外,如果遇到此问题,请考虑PageViewController本身未被保留的可能性。今天晚上我犯了一个错误,实例化一个PageViewController并将其视图添加为子视图,但未保留pageViewController本身。

确保无论是将其作为一个childViewController或将其分配给一个强大的属性把它保留下来。

+0

我将它添加到'UICollectionReusableView',所以我不能将它添加为childViewController 。因此,分配给一个强大的财产做到了。谢谢 – osrl

+0

我意识到我添加了UIPageViewController作为方法var,而不是实例变量,它正在为我创建问题。 – KarunPant75

0

只是花了一些时间,试图弄清楚为什么didFinishAnimating不叫。我的代表被设置正确,但事实证明,在Swift 3中功能如下:

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) 

注意上面的下划线。下面的函数将不会被调用。

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool)