2013-02-22 10 views
6

Attualmente sto personalizzando l'immagine di sfondo della barra di navigazione della mia app iOS utilizzando il proxy UIAppearance. C'è un pulsante per passare da una modalità all'altra che attiva una notifica. Questa notifica cambierà lo sfondo in un'altra immagine usando di nuovo il proxy. Il mio problema è che questo cambiamento diventa visibile solo quando vado a un controller diverso e torno ad esso. Non sono in grado di forzare l'aggiornamento della barra di navigazione all'interno del controller.Aggiornamento barra di navigazione dopo una modifica utilizzando UIApisione

Ho provato questo nel mio MainTabBarController:

- (void) onAppChangedMode: (NSNotification*)notif { 

APP_MODE mode = (APP_MODE) [[notif object] integerValue]; 

// change navigation bar appearance 
[[UILabel appearance] setHighlightedTextColor:[UIColor redColor]]; 
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:(mode == 0 ? @"navbar.png" : @"navbar2.png")] forBarMetrics:UIBarMetricsDefault]; 
// trying to update 
for (UIViewController* vc in self.viewControllers) { 
    [vc.navigationController.navigationBar setNeedsDisplay]; 
} 

} 

ma niente ... non funziona. Qualche idea su come ottenerlo?

Grazie!

+2

Non so perché, ma i cambiamenti la riapparizione al runtime non si applica a nessuna vista caricata. Tuttavia, è possibile applicare immediatamente le modifiche alle viste caricate. – ilmiacs

+0

vuol dire che non riesco ad usare UIAppearance ma devo impostare ogni barra separatamente – Claus

+0

No. Puoi usare UIAppearance ma le visualizzazioni visualizzate non saranno influenzate. Quindi quella visualizzata barra dovrebbe essere impostata in modo esplicito. – ilmiacs

risposta

0

provare questo codice per modificare l'immagine di sfondo per la barra di navigazione corrente solo:

[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; 

utilizza il codice precedente dopo aver cambiato l'UIAppearance. Ciò imporrà una modifica nella barra di navigazione del controller corrente. Le barre di navigazione per gli altri controller verranno gestite dal cambiamento di UIAppearance.

+0

il punto qui sta usando UIAppearance – Claus

+2

modificato le mie risposte. Usa il codice sopra INSIEME insieme al tuo codice per modificare la visualizzazione di UIA. –

7

mi resta che lo stesso problema, questo codice vi aiuterà a:

- (IBAction)btnTouched:(id)sender { 
    [[UADSwitch appearance]setOnTintColor:[UIColor redColor]]; 

    // Present a temp UIViewController 
    UIViewController *vc = [[UIViewController alloc]init]; 
    [self presentViewController:vc animated:NO completion:nil];//"self" is an instance of UIViewController 
    [vc dismissViewControllerAnimated:NO completion:nil]; 
} 
+1

+1 Utilizzato il tuo metodo e ottenuto un avvertimento/problema con il mio 'UITabBarController':' Attenzione: Tentativo di presentare su la cui vista non è nella gerarchia della finestra! '. Così ho modificato la tua soluzione sostituendo 'self' con' UIViewController * presentController = [[[[applicazioneApplicazione condivisa] delegato] window] rootViewController]; [presentController presentViewController: viewController animato: SÌ completamento: nil]; ', trovato [qui] (http://stackoverflow.com/a/13091131/2471006) - e ha funzionato. Serbatoi, mi ci sono voluti ore. – anneblue

+0

Non funziona per me su iOS9 –

10

sufficiente rimuovere viste dalle finestre e aggiungere loro di nuovo:

for (UIWindow *window in [UIApplication sharedApplication].windows) { 
    for (UIView *view in window.subviews) { 
     [view removeFromSuperview]; 
     [window addSubview:view]; 
    } 
} 
+1

Questo funziona perfettamente per me. Non sembra avere problemi di prestazioni ed è immediatamente efficace. – JamEngulfer