J'ai deux contrôleurs de vue. J'ai navigué d'une vue à une autre en appuyant sur le bouton pour utiliser le code ci-dessous.
*let secondViewController = self.storyboard!.instantiateViewControllerWithIdentifier("NotificationController") as! NotificationController
self.navigationController!.pushViewController(secondViewController, animated: true)*
Pour le dos, j'utilise le bouton barre sur le bouton barre, cliquez pour revenir en utilisant le code ci-dessous.
self.navigationController?.popViewControllerAnimated(true)
Donc, mon problème est que si je passe d’une vue à une autre en permanence, cela s’ajoute à une pile. Je souhaite uniquement afficher une autre vue lorsqu'elle est déjà ajoutée à la pile pour ne plus l'ajouter.Il n'ajoute qu'une seule fois.
Pour vérifier si la pile navigation contient un type particulier de view controller
, vous pouvez utiliser:
if let viewControllers = self.navigationController?.viewControllers
{
if viewControllers.contains(where: {
return $0 is YourViewController
})
{
//Write your code here
}
}
Pour supprimer un contrôleur particulier de la pile de navigation, vous devez modifier la pile de navigation.
Exemple:
if var viewControllers = self.navigationController?.viewControllers
{
for controller in viewControllers
{
if controller is UIViewController
{
viewControllers.removeElement(controller)
self.navigationController?.viewControllers = viewControllers
}
}
}
Pour Swift 4, vous pouvez utiliser
if let viewControllers = self.navigationController?.viewControllers {
for vc in viewControllers {
if vc.isKind(of: YourViewController.classForCoder()) {
print("It is in stack")
//Your Process
}
}
}
Développer la réponse de PGDev pour Swift 4.1
Comment supprimer une sous-classe UIViewController
spécifique de la pile UINavigationController
:
/// Given 'nc' is a valid UINavigationController instance,
/// removes all instances of MyViewController from the stack
nc.viewControllers = nc.viewControllers.filter { !($0 is MyViewController) }
En le mettant comme une extension:
extension UINavigationController
{
/// Given the kind of a (UIViewController subclass),
/// removes any matching instances from self's
/// viewControllers array.
func removeAnyViewControllers(ofKind kind: AnyClass)
{
self.viewControllers = self.viewControllers.filter { !$0.isKind(of: kind)}
}
/// Given the kind of a (UIViewController subclass),
/// returns true if self's viewControllers array contains at
/// least one matching instance.
func containsViewController(ofKind kind: AnyClass) -> Bool
{
return self.viewControllers.contains(where: { $0.isKind(of: kind) })
}
}
Utilisation:
guard let nc = self.navigationController else { return }
let exists = nc.containsViewController(ofKind: MyViewController.self)
nc.removeAnyViewControllers(ofKind: MyViewController.self)
BTW, si quelqu'un sait comment contraindre 'kind' aux sous-classes de UIViewController, veuillez crier.
Voici le code pour le vérifier.
if let viewControllers = navigationController?.viewControllers {
for viewController in viewControllers {
// some process
if viewController.isKindOfClass(ViewControllerClassName) {
println("yes it is")
}
}
}
Vous pouvez vérifier avec ci-dessous code
Objectif c
NSArray * controllers = [self.navigationController viewControllers];
for (int i = 0; i < [controllers count]; i++){
UIViewController * controllerTest = [controllers objectAtIndex:i];
if([controllerTest isKindOfClass:[YourController class]]){
NSLog(@"Class is available");
}
}
Swift 3.0
if let viewControllers = self.navigationController?.viewControllers {
for viewController in viewControllers {
// some process
if viewController.isKindOfClass(YourController) {
print("Class is available")
}
}
}
Et c'est parti.
Cette ligne vous donnera un tableau de UIViewControllers
self.navigationController?.viewControllers
Maintenant, ce que vous devez faire est de vérifier si votre viewControllerObject existe ou non?
En écrivant cette ligne
if viewController.isKindOfClass(YourController){
}
et voici un code complet.
if let viewControllers = self.navigationController?.viewControllers {
for viewController in viewControllers {
if viewController.isKindOfClass(YourController) {
print("Your controller exist")
}
}
}
Lorsque vous écrivez au-dessous de la ligne en revenant dans votre 'ViewControllerA', cela supprimera un ViewControllerB de la pile de navigation.
self.navigationController?.popViewControllerAnimated(true)
Il s’agit simplement d’une opération pop similaire à celle que nous effectuons avec stack et de navigationcontroller est une pile.
Faites-moi savoir si vous avez des confusions.