J'ai parcouru un tutoriel du coordinateur a> et cela a soulevé un problème avec le code que j'ai écrit dans le passé. À savoir, lors de la réutilisation d'un contrôleur de vue, j'ai utilisé une propriété pour pouvoir afficher différents éléments en fonction du contrôleur de vue d'où l'utilisateur est arrivé. Ceci est décrit dans le tutoriel ci-dessus comme un hack. Par exemple, je passe à labelviewcontroller en utilisant puis sur labelViewController ont une propriété p > dont je change ensuite les éléments dans viewDidLoad () à J'ai un exemple de projet de travail ici: https://github.com/stevencurtis/ReusibilityIssues Maintenant, je sais que la réponse pourrait be utiliser le tutoriel Coordinator, mais y a-t-il une autre méthode que je peux utiliser pour réutiliser simplement un viewController pour deux circonstances différentes, plutôt que d'utiliser une propriété ou y a-t-il de toute façon pour nettoyer cela pour être une pratique acceptable? override func viewDidLoad() {
super.viewDidLoad()
if originalVC != nil {
label.text = "came direct"
imageView.isHidden = true
}
else {
label.text = "button"
imageView.isHidden = false
}
}
var originalVC: ViewController?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "label" {
let vc = segue.destination as! LabelViewController
vc.originalVC = self
}
}
3 Réponses :
Je n'ai pas encore essayé le modèle de coordinateur, je ne peux donc pas faire de commentaire à ce sujet. Si vous cherchez une autre façon, je pense que l'utilisation de UserDefaults serait peut-être une meilleure solution.
Par exemple, disons que vous effectuez la transition vers labelViewController en appuyant sur un bouton:
override func viewDidLoad() {
super.viewDidLoad()
if userDefaults.bool(forKey: "seguedHere") == false {
label.text = "came direct"
imageView.isHidden = true
}
else {
label.text = "button"
imageView.isHidden = false
}
}
Je peux penser à quelques raisons pour lesquelles cela pourrait ne pas fonctionner. Le plus pertinent étant si deux instances de la même vue sont affichées à la fois, selon la façon dont implémenté afficherait un comportement indésirable. Essayez cependant ...
mais y a-t-il une autre méthode que je peux utiliser pour réutiliser simplement un viewController dans deux circonstances différentes
Si les "deux circonstances différentes" que vous décrivez sont très différentes (par là, je veux dire "nécessitent des lignes de code très différentes pour être exécutées"), vous devez alors créer deux classes de contrôleurs de vue différentes, car sinon vous violeriez le Principe de responsabilité unique .
Si vos «deux circonstances différentes» sont différentes , mais aussi assez liées, alors vous pouvez simplement avoir toutes les informations que le VC a besoin de connaître en tant que propriétés. Vous n'avez certainement pas besoin d'un
ViewControllerentier .Par exemple, si votre
LabelViewControlleraffichera un bouton "toto" uniquement s'il est présenté parViewControllerFoo.Vous pouvez ajouter une propriété
showFooButtondansLabelViewController:if segue.identifier == "label" { let vc = segue.destination as! LabelViewController vc.showFooButton = true }
Vous pouvez le faire sans passer originalVC simplement en vérifiant le type de parent si vous le poussez dans un contrôleur de navigation comme celui-ci:
if let p = parent {
if p.isKind(of: OriginalViewController.self){
//it pushed in navigation controller stack after OriginalViewController
}
}