2014-01-29 50 views
17

我讀過所有的教程中我發現約UIPageViewController,但他們只顯示基礎,我想創造這樣的新Twitter的應用程序有:UIPageViewController內NavigationController

enter image description here

UIPageViewController嵌入導航欄的標題以當前頁面爲基礎,並且那些頁面點也在那裏,用戶可以點擊當前頁面上的項目(表格視圖/集合視圖中的項目)來查看詳細信息。

我能夠想出類似的東西,每個頁面都有集合視圖,並且顯示某個項目的細節反映在導航欄中,有正確的標題和「<」按鈕,但我無法更改標題根據當前顯示的頁面

請你能描述一下如何在幾個步驟/控制器的基本結構中做到這一點?

+1

其實,你是如何在導航欄中找到點的? :) –

回答

14

不知道你是否仍在爲此工作,但無論如何這裏。要設置UIPageViewController,你可以使用下面的教程和兩個問題。

http://www.appcoda.com/uipageviewcontroller-storyboard-tutorial/

How to implement UIPageViewController that utilizes multiple ViewControllers

How to add UIBarButtonItem to NavigationBar while using UIPageViewController

最後一個環節具體來說,涉及取決於你正在查看的內容設置的導航欄的內容。

的關鍵是在你的UIPageViewController內容視圖控制器的.h文件中創建一個UINavigationItem屬性,這意味着那些/一個都顯示無論是你的顯示。

從我的代碼在FirstViewController.hSecondViewController.hThirdViewController.h

@property (strong, nonatomic) UINavigationItem *navItem; 

在你上面的第二和第三個環節會看到一個主從應用程序(它使用導航控制器)的故事板佈局。 UIPageViewControllerDataSourceDetailViewController。與pageViewController相關的三個頁面是我的內容視圖控制器。

在DetailViewController.m你必須從某個地方實例化contentViewControllers。此時,您將DetailViewControllers navigationItem標識傳遞給內容視圖控制器。以下是我如何使用UIPageViewController的代理方法實例化我的內容視圖控制器。

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

    NSString * ident = viewController.restorationIdentifier; 
    NSUInteger index = [_vc indexOfObject:ident]; 

    if ((index == 0) || (index == NSNotFound)) { 
     return nil; 
    } 

    index--; 

    if (index == 0) { 
     return [self controllerAtIndex:index]; 
    }else if (index == 1){ 
     return [self secondControllerAtIndex:index]; 
    }else if (index == 2){ 
     return [self thirdControllerAtIndex:index]; 
    }else{ 
     return nil; 
    } 
} 

委託方法調用下面的方法。它幾乎直接來自教程鏈接,僅做了一些修改。

-(FirstController *)controllerAtIndex:(NSUInteger)index 
{ 
    FirstController *fvc = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstPageController"]; 
    fvc.imageFile = self.pageImages[index]; 
    fvc.titleText = self.pageTitles[index]; 
    fvc.pageIndex = index; 
    fvc.navItem = self.navigationItem; 
    return fvc; 
} 

注意,屬性傳遞到包括self.navigationItem視圖控制器。通過它可以確保您可以更改導航條項目。

然後在您的內容視圖控制器的viewDidAppear方法,你可以簡單地這樣設置導航欄上的標題。

navItem.navigationItem.title = @"Whatever you want the title to be"; 

它使用viewDidAppear因爲viewDidLoad不叫每一個出現在屏幕上的時間是很重要的。我相信UIPageViewController可以在查看任何內容之前緩存頁面,並且可以保存系統在每次導航時都不必加載頁面。

如果您使用的是單一視圖控制器,所有你喜歡的網頁教程不,你將不得不使用索引屬性來知道如何設置標題爲。

希望這會有所幫助!

+0

嗨,非常感謝!我已經改變了GUI的佈局,但我相信它對我有用:) –

+4

您可以通過查找頁面控制器來避免額外的屬性:'UIViewController * child = [[self.navigationController childViewControllers] lastObject]; child.navigationItem.title = @「我的標題」;' –

5

我有一個非常類似的設置,並解決了這個問題。

我的設置是,我有一個UIPageViewController一個UINavigationController裏面,因爲我想導航欄是持久的,而我的每個視圖控制器之間刷卡。我希望UIPageViewController中的當前UIViewController的標題成爲UINavigationController的標題。

執行此操作的方法是實現UIPageViewControllerDelegate方法pageViewController didFinishAnimating,該方法在從UIPageViewController更改爲視圖控制器後觸發。你可能會看到這個地方:從這裏,設置UIViewPageController的navigationItem.title屬性,UINavigationController用它來設置它自己的標題,以及當前視圖控制器標題的屬性。

實施例:

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 
{ 
    if(finished && completed) 
    { 
     NSString *titleOfIncomingViewController = [[pageViewController.viewControllers firstObject] title]; 
     pageViewController.navigationItem.title = titleOfIncomingViewController; 
    } 
} 

NB:此委託方法觸發僅關閉手勢發起滾動。

+0

我處於這種確切的狀況。您的解決方案運行良好,但我希望標題也能顯示在第一個視圖控制器上。你找到了解決方法嗎? – Isuru

+0

對不起,你是什麼意思的'第一視圖控制器'?你的意思是開始的那個,所以它沒有觸發這個方法? – micnguyen

0

Isuru先生! 我得到了你的問題......通過Micnguyen先生給出 解決方案是精確解,但提到的委託方法(didFinishAnimating())時刷卡操作完成後,由於未示出的最初書名就叫。

因此解決這一問題,我們需要設置在viewDidLoad中()UIPageViewController類的方法的初始值如下面提及:

  • (無效)viewDidLoad中(){ self.navigationitem.title = arrayName中[0]; }

謝謝!