7

Questo è quello che sto cercando di realizzare: NavigationBar NB: anche con un titolo al controller. Apparirà barCome sottoclasse UINavigationBar correttamente utilizzando anche l'aspetto

  1. Questa navigazione su circa 10 controller di vista -:

    Alcune informazioni aggiuntive.

  2. Non fa parte di un controller di navigazione, come non richiesto.
  3. Il pulsante a sinistra è statico (sarà sempre sulla barra di navigazione).
  4. Il pulsante destro non è statico e non esisterà o sarà diverso sui diversi controller di visualizzazione.
  5. Il pulsante sinistra funge da menù a scorrimento (vale a dire le diapositive di menu nel sotto da sinistra)
  6. sto usando storyboard nel setup

Domanda Qual è il modo corretto per raggiungere questo obiettivo?

Codice esistente ho cercato di attuare questo, ma posso ottenere solo uno o l'altro dei pulsanti, senza un titolo di lavoro. Per implementare lo sfondo ho usato le API apparizione come di seguito:

didFinishLaunching ...

// Custom Navigation Bar appearance setup 
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: 
                 [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], UITextAttributeTextColor, 
                 [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5],UITextAttributeTextShadowColor, 
                 [NSValue valueWithUIOffset:UIOffsetMake(0, 1)], 
                 UITextAttributeTextShadowOffset,nil]]; 
// Used to deal with the rotation of the nav bar when implemented outside of Navigation Controller 
[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight]; 
[[UINavigationBar appearance] setContentMode:UIViewContentModeScaleAspectFit]; 

// Set the background image 
UIImage *imageBg = [[UIImage imageNamed: @"mainNavBar"] resizableImageWithCapInsets:UIEdgeInsetsMake(0,5,0,5)]; 
[[UINavigationBar appearance] setBackgroundImage:imageBg forBarMetrics:UIBarMetricsDefault]; 

// Used to push the title down slightly when in Landscape and NavBar outside of Navigation Controller 
[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:2 forBarMetrics:UIBarMetricsLandscapePhone]; 

Ho poi sottoclasse UINavigationBar per la creazione tasto sinistro con il seguente: sottoclasse di UINavigationBar: awakeFromNib

Quindi all'interno dello storyboard aggiungo una barra di navigazione al VC in questione e al collegamento alla sottoclasse corretta. Aggiungo inoltre un elemento pulsante aggiuntivo alla barra di navigazione nello storyboard per quel controller e il collegamento a una presa. Poi all'interno del VC provo ad aggiornare il titolo e tasto destro con il qui sotto:

View Controller che contiene la sottoclasse barra di navigazione: viewDidLoad

// Set VC Title for NavBar 
self.title = NSLocalizedString(@"NavBarHomeTitle", @"Navigation Bar - Home page title"); 

// Setup the right navigation bar item 
UIImage *addImage = [UIImage imageNamed:@"addGameButton"]; 
UIButton *addButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[addButton setFrame:CGRectMake(0, 0, addImage.size.width, addImage.size.height)]; 
[addButton setBackgroundImage:addImage forState:UIControlStateNormal]; 
[addButton addTarget:self action:@selector(addGameButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
[self.rightBarButtonItem setCustomView:addButton]; 

Il risultato è una barra di navigazione con solo la sinistra pulsante. Ora credo che questo sia dovuto al codice awakeFromNib sopra alloc init un nuovo UINavigationItem quindi non posso controllare il titolo e aggiungervi un pulsante. Come posso completare questo? È questo l'approccio migliore o ci sono altri? Non riesco a vedere alcun tutorial approfondito su come affrontarlo.

risposta

10

L'opzione migliore consiste nell'utilizzare un controller di navigazione, che funge da controller che interroga il controller di visualizzazione attualmente visualizzato e aggiorna la barra di navigazione.

Invece della sottoclasse della barra di navigazione, è necessario creare una sottoclasse del controller di navigazione. Quindi, ogni volta che il controller della vista visualizzato cambia, è possibile impostare la voce del pulsante sinistro aggiungendola all'elemento di navigazione di tale controller. Ogni controller di visualizzazione può specificare qualsiasi elemento del pulsante della barra a destra richiesto.

Il modo più semplice per eseguire questa operazione è che il controller di navigazione funga da proprio delegato e implementa navigationController:willShowViewController:. Utilizzando questo metodo è possibile accedere allo navigationItem del controller di visualizzazione passato e impostare lo leftBarButtonItem. È inoltre possibile accedere agli altri metodi di navigazione e visualizzare i controller, se necessario.

Ogni controller di visualizzazione, inoltre, in viewDidLoad, imposta il suo self.navigationItem.rightBarButtonItem(s) ai pulsanti appropriati per i requisiti della sua vista. Ad esempio il pulsante della barra "addGameButton".

In questo modo, l'aspetto funzionerà come previsto, il titolo del controller di visualizzazione funzionerà automaticamente e il controllo completo e un numero di metodi nella sottoclasse del controller di navigazione, per eseguire le personalizzazioni di pulsanti e interazione. .

+0

grazie, potresti fornire un po 'più di informazioni su come realizzare questo per favore? Capisco la sottoclasse del controller di navigazione, ma non sono sicuro su come impostare gli elementi insieme a '..può specificare qualsiasi elemento del pulsante della barra di destra che richiede' ... per ogni VC? – StuartM

+0

qualsiasi altra informazione che potresti fornire su questo per favore? – StuartM

+0

Penso che il problema con questa rotta sia che ho circa 10 controller di vista che dovrebbero essere nei propri controller di navigazione? O intendi avere l'unico controller di navigazione e spingere ogni volta un nuovo controller di visualizzazione radice? – StuartM