0

我想要建立一個自定義導航欄,它可以處理與股票UINavigationBar不同的導航操作。爲了做到這一點,一個核心要求是導航欄永遠不會更改它的一組對象,因此它總是有一個具有相同左右欄項目和相同自定義視圖的項目。自定義視圖旨在具有面包屑式視圖,以允許用戶一次返回1個或多個視圖控制器。如何防止將UINavigationItems推送到由UINavigationController管理的UINavigationBar中?

我試圖通過使用自定義UINavigationBar子類,像這樣一個普通的UINavigationController做到這一點:

window.rootViewController = [[UINavigationController alloc] initWithNavigationBarClass:[BreadcrumbNavigationBar class] toolbarClass:nil]; 

,並在酒吧類我(現在)攔截假想修改所有呼叫在UINavigationItem S IN的導航欄,什麼也不做,而不是:

@implementation BreadcrumbNavigationBar 

- (void)setItems:(NSArray *)items 
{ 
} 

- (void)setItems:(NSArray *)items animated:(BOOL)animated 
{ 
} 

- (void)pushNavigationItem:(UINavigationItem *)item animated:(BOOL)animated 
{ 
} 

- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated 
{ 
    return nil; 
} 

@end 

然而,這是行不通的。如果我導航到一個新的屏幕,導航欄將表面上不應該將新項目推到它的堆棧上。但是由於某種原因,新項目上的後退按鈕不會返回。

是我想做的可能嗎?使用UINavigationController的替代方法是使用自定義導航控制器,它模仿UINavigationController的外觀和行爲,但表現得很像我想要的導航欄;然而,有很多不錯的行爲UINavigationController免費給我免費,我不想如果可能重新實施。

編輯

張貼在此之後我發現這個職位:

UINavigationBar -pushNavigationItem never called when new controller is pushed onto UINavigationController stack

,如果我也實現了- (void)pushNavigationItem:(UINavigationItem *)item那麼事情種爲先導航項目的工作;然而,如果我將這些方法填充一點,以便只保留items數組中的一個項目,那麼當我將視圖控制器推入堆棧時,導航欄的行爲就好像來自根視圖控制器的UIBarButtonItem不再出現一樣,儘管該項目被阻止在pushNavigationItem方法中被推入。

回答

0

我建議創建一個標準UINavigationController作爲父容器。 rootViewController將是一個UINavigationController子類,該子類隱藏其UINavigationBar,並在其導航項中具有正確的左側和右側導航按鈕。

//You would need to populate these variables 
    UIViewController * actualController; 
    UIBarButtonItem * rightBarButtonItem; 
    UIBarButtonItem * leftBarButtonItem; 

    UINavigationController * childNavigator = [[UINavigationController alloc] initWithRootViewController:actualController]; 
    [childNavigator setNavigationBarHidden:YES]; 
    [[childNavigator navigationItem] setRightBarButtonItem:rightBarButtonItem]; 
    [[childNavigator navigationItem] setLeftBarButtonItem:leftBarButtonItem]; 

    UINavigationController * parentNavigator = [[UINavigationController alloc] initWithRootViewController:childNavigator]; 

您的實際視圖控制器將推動和彈出的孩子UINavigationController有沒有UINavigationBar。顯示的UINavigationBar從不會根據推/彈動作進行更改。

+0

這是一個選項;當一個新的控制器被推入或彈出時,唯一粘性的部分就是改變內部導航控制器上的'edgesForExtendedLayout',並確保向上傳播到包含導航控制器。我使用的是一個自定義的視圖控制器,我相信現在沒有這個控制器是一樣的;如果一個令人信服的理由改變到你的建議實現出現,那麼我會試試看。 – Kevlar

相關問題