2015-08-16 106 views
5

我一直在整個週末都在爲這個問題而苦苦掙扎,並且花了很長時間用Google搜索找到沒有任何成功的解決方案。UIPageViewController無法跟蹤頁面索引

我的用例非常簡單,我無法相信讓這種平凡的行爲正常工作是多麼困難。

我的應用程序是一個簡單的分頁流程,用戶向左或向右滑動以查看下一頁或上一頁。我有一個UIPageViewController,每個頁面都包含一個UITableView。我曾試圖保持viewControllerAfterViewController和viewControllerBeforeViewController功能的原因裏面的頁面索引的跟蹤問題說明如下:PageViewController delegate functions called twice

我試過下面這個問題(跟蹤指數的內部willTransitionToViewControllers和所有建議的解決辦法didFinishAnimating)但這並不能解決我的問題,因爲viewController * ViewController函數必須返回一個viewController,並且由於它們最初被調用了兩次,第一次返回的viewController似乎是被使用的並且第二次傳遞似乎不是有任何影響。

雖然我看過很多關於這個問題的問題和博客,但我還沒有看到過一個例子,它展示瞭如何始終從viewController * ViewController函數中返回正確的viewController,並且將非常感謝一個例子。我看不到解決方案的主要問題是如何確定willTransitionToViewControllers中的下一個索引,如果我只有一個viewController,其內容在頁面加載時動態更新。這對我來說似乎是一個雞和雞蛋的問題;我需要找出更新頁面的內容,但要做到這一點,我需要知道頁面的索引(哪些是內容的一部分)。

編輯 下面是受影響的代碼的精華版本:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    _pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; 
    _pageViewController.dataSource = self; 
    _pageViewController.delegate = self; 
    [self.view addSubview:_pageViewController.view]; 

    PageContentViewController *startingPage = [self viewControllerAtIndex:0]; 

    NSArray *viewControllers = @[startingPage]; 
    [_pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 

} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 
    // Don't do any index calculations as the result is inconsistent 
    return [self viewControllerAtIndex:nextIndex]; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 
    // Don't do any index calculations as the result is inconsistent 
    return [self viewControllerAtIndex:nextIndex]; 
} 

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers { 
    // This value never changes because the global _pageViewContentController hasn't been updated yet 
    nextIndex = [((PageContentViewController *)pendingViewControllers[0]) pageIndex]; 
} 

- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index { 
    _pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"]; 
    _pageContentViewController.pageIndex = index; 
    _pageContentViewController.title = index; 

    return _pageContentViewController; 
} 

我已經調試中,這些函數被調用,並會預計全球_pageViewContentController用正確的數據填充的順序在頁面過渡之後。

編輯2 給我一些更詳細的問題;我的每個網頁都包含一個標題和一個網頁鏈接表。單擊鏈接將打開一個WebViewController以顯示選定的網頁。通過下面的Yunus解決方案,所有內容都可以正確顯示(標題和鏈接按預期顯示),但點擊鏈接時會出現問題,因爲這會從下一頁加載鏈接。似乎頁面的渲染階段發生在數據正確的位置,但是在渲染完成後,它會用不正確的數據重新初始化頁面內容控制器,這就是爲什麼實際的鏈接數據是錯誤的(即使渲染的數據是好的)。

+0

你能分享一些你的代碼的相關部分嗎? –

+0

@YunusErenGuzel - 添加了代碼片段。 – bobby

+0

你如何打開這個WebViewController?在UIPageViewController或作爲模式或等? –

回答

3

讓我們把所有的相關contentViewControllers陣列中的

self.contentViewControllers = [NSMutableArray new]; 
for(int i=0; i< MAX_INDEX; i++) { 
    [self.contentViewControllers addObject:[self viewControllerAtIndex:0]]; 
} 

那麼我們需要做的是決定哪些視圖控制器,我們應該後和之前的方法

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
    viewControllerBeforeViewController:(UIViewController *)viewController 
{ 

    for(int i=0;i<self.contentViewControllers.count ;i++) 
    { 
    if(viewController == [self.contentViewControllers objectAtIndex:i]) 
    { 
     if(i-1 >= 0) 
     { 
     return [self.contentViewControllers objectAtIndex:i-1]; 
     } 
    } 
    } 
    return nil; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
     viewControllerAfterViewController:(UIViewController *)viewController 
{ 

    for(int i=0;i<self.contentViewControllers.count ;i++) 
    { 
    if(viewController == [self.contentViewControllers objectAtIndex:i]) 
    { 
     if(i+1 < self.contentViewControllers.count) 
     { 
     return [self.contentViewControllers objectAtIndex:i+1]; 
     } 
    } 
    } 
    return nil; 
} 

然後在顯示上過渡方法

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers 
{ 
    UIViewController* viewController = [pendingViewControllers objectAtIndex:0]; 
    NSInteger nextIndex = [self.contentViewControllers indexOfObject:viewController]; 
    [self.pageControl setCurrentPage:nextIndex]; 
} 
+0

嗨Yunus。謝謝你的幫助。我修改了我的代碼以嘗試您的建議(這是我在週末已經嘗試過但未獲成功的內容)。在你的例子中,你正在設置nextIndex值,但它從來沒有在任何地方使用過。我在這裏錯過了什麼嗎? – bobby

+0

其實,我保留你的空想,然而你想使用。我使用它與SMPageControl保持索引與'[self.pageControl setCurrentPage:nextIndex];' –

+0

你可以使用這個ViewController看看它是如何工作的。 https://github.com/yunuserenguzel/sonicraph-ios/blob/master/sonicraph/View%20Controllers/SNCGoThroughViewController.m –