2014-02-27 175 views
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)