9

請原諒我,關於如何以編程方式將UIBarButtonItem添加到NavigationBar已經有很多問題,但我似乎無法獲得任何解決方案以在我的工作情況。如何在使用UIPageViewController時將UIBarButtonItem添加到NavigationBar

這是我一直在學習UIPageViewController的簡單測試應用程序的佈局。

storyboard

我有三個獨特的viewControllers工作很好的頁面視圖控制器。我現在想爲每個視圖控制器設置獨特的rightBarButtonItems。通過簡單地做到這一點,我可以輕鬆地在DetailViewController中設置一個共同的barButtonItem

UIBarButtonItem *newButton = [[UIBarButtonItem alloc] initWithTitle:@"Whatever" 
           style:UIBarButtonItemStylePlain 
           target:self 
           action:@selector(doSomething)];  

self.navigationItem.rightBarButtonItem = newButton; 

考慮到我需要爲每個在pageViewController三頁的獨特的按鈕,我不能夠設置在detailViewController按鈕。我已經嘗試了三個控制器的viewDidAppear中的上述代碼,但不會出現按鈕。我也嘗試以相同的方式創建按鈕,然後像這樣設置它,但沒有運氣。

DetailViewController *vc = [[DetailViewController alloc] init]; 
vc.navigationItem.rightBarButtonItem = newButton; 

我知道我靠近這裏,我只是不知道如何指定我需要一個按鈕添加到正在運行detailViewController我contentViewControllers嵌入在NavigationController的導航欄。任何幫助將是偉大的特別SN​​IPPETS。

作爲一個側面說明,我嘗試了一些其他方法出現問題。

  • viewDidLoad設置按鈕,而不是viewDidAppear
    • 這是行不通的,因爲viewDidLoad方法不叫你刷卡從一個頁面到下每次。然而,viewDidAppear方法是,所以我試圖在那裏設置按鈕。有可能每次調用viewWillAppear但我沒有檢查。
  • 在UIPageViewController委託方法
    • 這是有問題的,如果用戶翻閱的頁面快速按鈕將無法更改或無法顯示設置按鈕。

SOLUTION

原來我很接近......而不是在UIPageViewController方法,我只是需要建立在每一個我的三個視圖控制器的navigationItem屬性創建按鈕。當控制器在委託方法中實例化時,我只需將navigationItem屬性設置爲與detailViewController相同。在我的viewDidApper方法中,我可以創建按鈕。然後在viewWillDisappear我將按鈕設置爲nil。您也可以創建DetailViewControllerviewdidLoad按鈕並更改各個viewControllers的文本和操作viewDidAppear。這是一個示例。

在委託方法

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

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

我打電話基礎上的viewController的指標一個輔助方法。助手方法在調用視圖控制器時實例化視圖控制器。一旦實例化,我設置了一些屬性,包括navigationItem屬性。

-(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; 

} 

然後在的viewController的viewDidAppear我只是這樣做

-(void)viewDidAppear:(BOOL)animated 
{ 

    UIBarButtonItem *newButton = [[UIBarButtonItem alloc] 
           initWithTitle:@"Whatever" style:UIBarButtonItemStylePlain target:self action:@selector(doSomething)]; 
    navItem.rightBarButtonItem = newButton; 

} 
+0

viewControllers上的navItem屬性是什麼? –

+0

偉大的解決方案:-) – Fabrizio

回答

1

如果您每次更改所看到的頁面時都需要更改該按鈕,則必須使用您嘗試的其中一種委託方法完成此操作。然而,我建議您不要創建一個新按鈕並將其設置爲導航項目,而只需更改標題。

您可以在界面構建器中創建按鈕並將其鏈接到您的DetailViewController中的某個媒體資源,然後每次進入新頁面時都會按鈕上的setTitle:forStateUIControlStateNormal

如果您需要按鈕爲每個頁面做不同的事情,我會建議在按鈕操作方法中檢查當前頁面,而不是每次都聲明一個新頁面。

+1

mros,感謝您的回答,我不得不嘗試讓委託方法爲我工作。經過一些故障排除後,我意識到這個問題,我之前嘗試使用'vc.navigationItem.rightBarButtonItem'等設置按鈕。我基本上是創建一個新的導航項並添加一個按鈕。由於navigationController的特性,新的navigationItem不會出現在其頂部。然後我意識到我可以簡單地通過委託方法將我的DetailViewController中的navigationItem屬性傳遞給我的單獨頁面視圖控制器。謝謝! – Ben

0

我的一位同事經歷了網頁瀏覽器相同的問題。

據我所知,你不會添加UIBarButtonItem到UIPageViewController的成員視圖控制器的導航欄。對於UIPageViewController,原因是'navigationController'被設置爲零。要確認,請打印[UIPageViewController navigationController]的值。

但是你可以做一件事來克服這個問題。請下載示例PhotoScroller

而且做AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
// kick things off by making the first page 
PhotoViewController *pageZero = [PhotoViewController photoViewControllerForPageIndex:0]; 

UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:pageZero]; 
if (pageZero != nil) 
{ 
    // assign the first page to the pageViewController (our rootViewController) 
    UIPageViewController *pageViewController = (UIPageViewController *)self.window.rootViewController; 
    pageViewController.dataSource = self; 

    [pageViewController setViewControllers:@[nav] 
            direction:UIPageViewControllerNavigationDirectionForward 
            animated:NO 
           completion:NULL]; 
} 
return YES; 
} 

以下變化及PhotoViewController.m

- (void)loadView 
{ 
..... 
..... 
self.title [email protected]"Frogs"; 
UIBarButtonItem *newButton = [[UIBarButtonItem alloc] initWithTitle:@"Something" style:UIBarButtonItemStylePlain target:self action:@selector(doSomething)]; 

[newButton setTintColor:[UIColor redColor]]; 
self.navigationItem.rightBarButtonItem = newButton; 
} 

爲了避免撞車以下更改,必須正確處理AppDelegate.m UIPageViewControllerDataSource委託方法

雖然,我不會建議你在上面做,因爲它打破了UIPageViewController的整個概念。

我希望這會有所幫助。

+0

Hitesh,感謝您的意見,但我將避免這條路線!只要您的UIPageViewControllerDataSource嵌入到導航控制器中,您實際上可以將UIBarButtonItems添加到navBar。我在我的問題中的示例基本上將UIPageViewController成員置於Master-Detail應用程序的detailViewController的頂部。這樣導航欄仍然保持活動狀態。我忽略了將detailViewController的navigationItem屬性傳遞給我的pageViewController成員。一旦意識到這是一個簡單的任務!再次感謝 – Ben

1

您可以通過在其分頁視圖控制器之一中找到頁面控制器,然後獲取其導航項目,找到正確的導航項目以設置按鈕/標題。例如

UIViewController *pageController = [[self.navigationController childViewControllers] lastObject]; 
pageController.navigationItem.title = @"My page's title"; 

這真的很煩人,self.navigationItem不起作用!

相關問題