2017-01-28 5 views
-1

Mon code fonctionne, mais j'essaie de le comprendre. C'est un peu de code utilisé pour gérer un bouton "Annuler" qui peut renvoyer soit d'une séquence "Show" (présentée lorsque l'utilisateur clique sur une cellule de vue table pour l'éditer) ou d'une séquence "Present Modally" (lorsque l'utilisateur clique sur " + "élément de bouton de barre pour ajouter une nouvelle cellule à la vue de table). Diagramme ci-dessous. Je suis confus par UINavigationController et la propriété navigationController. Excuses si je manque quelque chose de très évident.Difficulté rapide à comprendre UINavigationController & navigationController re: presentingController

// Apple says below is nil if neither the current view controller nor any of its ancestors were presented modally 
let isPresentingInAddMode = presentingViewController is UINavigationController 
if isPresentingInAddMode { 
    // Modal segues need to be dismissed 
    dismiss(animated: true, completion: nil) 
} else { 
    // But Show segues are "popped" off of a stack of controllers. 
        navigationController!.popViewController(animated: true) 
} 

's Ici ce j'am pas understanding: - Si je've arrived au Detail View Controller via un "Show" segue, pause pendant execution et option-click sur navigationController, Xcode says que ce's un UINavigationController ? Et si je fais une pause dans l'exécution de la condition &, utilisez le débogueur pour: po navigationController! == nil - Xcode dit que cela est faux, donc navigationController est un UINavigationController valide.

Alors, pourquoi ne pas

presentingViewController is UINavigationController 

assimilent à true dans la plus haute déclaration quand je l'ai présenté à l'aide d'un « Show »?
Peut-être que je ne comprends pas "présent". Est-ce que la présentation de quelque chose qui se passe seulement avec des segmen modaux, donc il n'y a pas de PresentViewController? Et si je repense à mon storyboard (voir schéma ci-dessous), l'un des ancêtres du contrôleur de vue de détail est un contrôleur de vue de table doté d'un contrôleur de navigation intégré à la commande presentationViewController d'Apple: presentingViewController is UINavigationController Soyez aussi dans cette situation?

Et cela:

presentingViewController != nil 

obtenir le même résultat ou est-il une raison importante de vérifier l'presentingViewController est un UINavigationController?

Merci beaucoup pour toute personne assez aimable pour m'aider à analyser cela. John

enter image description here

enter image description here

Le Segue "ShowDetail" est un "Show" Segue provenant de la vue de la table cellulaire. La section "AddItem" est de type "Present Modally" et provient de l'élément de bouton "+".

Il est probablement pas nécessaire de voir le préparer pour le code de Segue dans le contrôleur de vue de la table, mais si vous êtes curieux:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
    if segue.identifier == "ShowDetail" { // is this the "ShowDetail" segue? and if it is... 
     // ... get the IndexPath for the row the user clicked on (the selected row) 
     let indexPath = tableView.indexPathForSelectedRow! 
     let destinationViewController = segue.destination as! DetailViewController // downcast the destination as the specific class DetailViewController 
     // Get the to do item that the user clicked on 
     let selectedToDo = toDoArray[indexPath.row] 
     // Pass selectedToDo to the toDoItem variable in our destinationViewController 
     destinationViewController.toDoItem = selectedToDo 
    } 
} 
+0

s'il vous plaît ajouter du code où vous appelez les ViewControllers – muescha

+0

mettre des extraits de code de tir entre deux de ce char: '(backtick) – muescha

+0

Salut - il ya un spectacle Voir -" ShowDetail "est son identifiant. "AddItem" est appelé à partir de l'élément "+" du bouton de barre d'addition, tandis que "ShowDetail" est appelé depuis la cellule de vue de table. Je vais ajouter le "préparer (pour segue :) code pour le contrôleur de vue de la table ci-dessus, mais il ne devrait pas importer re: comprendre le UINavigationController vs navigationController, devrait-il? Thx – Gallaugher

Répondre

2

Peut-être que je ne comprends pas « présent ».

Peut-être.Consultons le tableau:

enter image description here

Il y a deux couramment utilisés intégrés: enchaînements

  • Show, anciennement connu sous le nom Push. S'il est utilisé dans une situation UINavigationController, comme prévu, appelle pushViewController. Le contrôleur de vue poussée a un navigationController. Le retour est effectué en appelant popViewController.

  • Présent, anciennement connu sous le nom de Modal. Appelle presentViewController (maintenant appelé present). Le contrôleur de vue présenté a un presentingViewController. Le retour est effectué en appelant le dismiss.

Cependant, il y a une complication qui peut vous confondre: si show est utilisé pas dans une situation de UINavigationController, au lieu de l'univers explose comme prévu, il se transforme comme par magie en present.

+0

Malheureusement, les gens qui parlent de manière informelle disent très souvent "présent" quand ils veulent dire "pousser", donc vous devez regarder – matt

+0

Cela a été très utile, donc les modaux ont toujours un PresentViewController Est-il approprié d'utiliser l'une de ces deux instructions pour tester si un contrôleur de vues est modal? "presentingViewController! = nil" ou "presentingViewController is UINavigationController"? – Gallaugher

+0

Presque, regardez plus attentivement ce que j'ai dit et demandez si 'self.presentingViewController! = Nil' est comment savoir si' self' est un contrôleur de vue présenté. vigationController! = nil' est comment savoir si 'self' est un contrôleur de vue poussé. - En général, cependant, vous ne le saurez jamais, donc dans la pratique, la question ne se pose généralement pas. – matt