Ho bisogno di fare certe cose quando il mio controller di visualizzazione è sia spinto o scoppiato dallo stack di navigazione, ma non voglio usare viewillappear/viewdidappear o viewwilldisappear/viewdiddisappear poiché questi coprono i casi oltre a quando il controller della vista viene premuto/scoppiato. È il modo corretto per utilizzare questa funzionalità per utilizzare il delegato navigationcontroller e il navigationController: didShowViewController: animated: and navigationController: willShowViewController: animated:? In caso contrario, qual è il modo migliore per farlo?Come essere avvisati quando uiviewcontroller viene premuto/scoppiato dallo stack di navigazione
risposta
Per sapere quando è premuto, è possibile utilizzare il
UINavigationControllerDelegate
e implementare
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
Questo metodo si attiverà ogni volta che il viewcontroller viene spinto nella pila di navigazione, e ogni volta che il viewcontroller su di esso viene saltato fuori, rivelando di nuovo. Quindi devi usare un flag per capire se è stato ancora inizializzato, se non lo è significa che è stato appena spinto.
Per sapere quando è stato spuntato, utilizzare questa risposta:
È possibile provare i metodi delegati di UINavigationController che chiama quando l'oggetto push o pop dallo stack del controller di navigazione.
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
si può sempre creare un semplice sottoclasse della UINavigationController e avvolgere i metodi del suo superclasse in modo che si imposta una bandiera prima di chiamare:
ActionNavigationController.h
#import <UIKit/UIKit.h>
@interface ActionNavigationController : UINavigationController
@property (nonatomic, readonly) BOOL pushing;
@end
ActionNavigationController.m
#import "ActionNavigationController.h"
@implementation ActionNavigationController
@synthesize pushing = _pushing;
-(void)pushViewController:(UIViewController *)viewController
animated:(BOOL)animated {
_pushing = YES;
[super pushViewController:viewController animated:animated];
}
- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
_pushing = NO;
return [super popViewControllerAnimated:animated];
}
- (NSArray *)popToViewController:(UIViewController *)viewController
animated:(BOOL)animated {
_pushing = NO;
return [super popToViewController:viewController animated:animated];
}
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
_pushing = NO;
return [super popToRootViewControllerAnimated:animated];
}
@end
Come pushing
valuterà a NO
evento se non accade nulla, questo codice dovrebbe essere accessibile dalla UINavigationControllerDelegate.
Ecco un esempio per rilevare quando un controller di vista è stato inserito nello stack di navigazione sovrascrivendo -viewWillAppear:
e spuntato l'override -viewWillDisappear:
-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (self.isMovingToParentViewController) {
NSLog(@"view controller being pushed");
}
}
-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.isMovingFromParentViewController) {
NSLog(@"view controller being popped");
}
}
Si può fare qualcosa di simile in willShowViewController
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
if self.navigationController!.viewControllers.contains(self){
print ("push")
} else {
print ("pop")
}
}
Fai attenzione a usare
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
Se scorri utente dal bordo in giusto per popping View Controller (e non in realtà pop), si invocherà sopra la funzione del delegato, ma non al di sotto funzione
- (void)navigationController:(UINavigationController *)navigationController
didShowViewController:(UIViewController *)viewController
animated:(BOOL)animated;
Si prega di fare riferimento al https://gist.github.com/nonamelive/9334458
- 1. Come essere avvisati quando un SocketChannel viene chiuso?
- 2. UICollectionView calling scrollViewDidScroll: quando prelevato dallo stack di navigazione
- 3. Come essere avvisati quando l'utente nega i dati di fitness?
- 4. Come posso mostrare una barra delle linguette quando si spinge un UIViewController nello stack di navigazione
- 5. Valore minimo dallo stack
- 6. L'orientamento di UIViewController cambia in uno stack UINavigationController
- 7. Come essere avvisati quando vengono create nuove versioni di Ruby o Rails?
- 8. Come si cancella lo stack di navigazione?
- 9. Come essere avvisati sulla modifica dello stato della rete wifi?
- 10. Come essere avvisati quando si esegue l'override di un metodo virtuale con visibilità errata
- 11. Come essere avvisati quando cambia l'attività in primo piano (in alto) (applicazione)
- 12. Storyboard iOS5 UIViewController quale metodo di init viene chiamato dallo storyboard?
- 13. Come si può determinare quale tipo di carattere viene utilizzato dallo stack CSS?
- 14. Come essere avvisati quando un thread è stato terminato per qualche errore
- 15. Android rimuovi l'attività dallo stack posteriore
- 16. In Ruby, come essere avvisati delle chiavi duplicate negli hash quando si carica un documento YAML?
- 17. Come riflettere sull'implementazione dell'interfaccia esplicita C# dallo stack di chiamate?
- 18. Pagine pop off stack di navigazione nell'app di Windows 8
- 19. Come si accede alle variabili locali della funzione dallo stack?
- 20. iOS 7 UIViewController (con barra di navigazione) non inserito UIScrollView
- 21. Come si eliminano tutte le attività dallo stack?
- 22. Come rimuovere un controller di visualizzazione specifico dallo stack uinavigationcontroller?
- 23. Impossibile nascondere la tastiera nello stack UIViewController quando UIAlertView è sullo schermo
- 24. Come posso creare uno stack di navigazione globale?
- 25. ViewDidAppear non viene chiamato quando si apre l'app dallo sfondo
- 26. ActionBar esce dallo schermo quando viene visualizzata la tastiera
- 27. iPhone UIViewController metodo init non viene chiamato
- 28. Xcode: Rilevamento quando viene premuto un controller di navigazione implementato "pulsante Indietro"
- 29. Un modo per essere avvisati quando qualcosa si iscrive ad un evento/delegato?
- 30. savedInstanceState durante il ripristino del frammento dallo stack posteriore
'Overriding' è un molto più parola migliore – noob