2017-08-01 1 views
0

Longue histoire courte, mon segue n'a pas pu être exécuté sur mon prochain contrôleur que j'ai déjà créé. Beaucoup d'aide sera appréciée.performSegue (withIdentifier .......) ne fonctionne pas

override func viewDidLoad() { 
     super.viewDidLoad() 


     var returnValue: Int = UserDefaults.standard.integer(forKey: "quiz1Validation") 
     if (returnValue == 1) 
     { 
      performSegue(withIdentifier: "completed", sender: self) 
     } 
     else { 
     var returnValue: Int = UserDefaults.standard.integer(forKey: "userScore") 
     scorelabel.text = "Score:\(returnValue)" 
     RandomQuestions() 
    } 

} 
+2

Quelle est l'erreur? – Grady

+0

Avez-vous créé le segue dans storyboard de votre VC actuel à un nouveau. L'identifiant est également correct? –

+0

Oui j'ai déjà fait tout ce que vous avez dit, je pense que c'est parce que je ne peux pas le charger dans viewdidload – Kinja

Répondre

0

Réalisation d'une Segue sur viewDidLoad n'est pas recommandé que votre viewController est pas encore sur la pile.

Comme le travail autour de vous pouvez essayer, mais je changer la logique de ne pas l'utiliser:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 
    performSegue(withIdentifier: "completed", sender: self) 
} 
+1

Je découragerais sérieusement quiconque d'utiliser une telle solution de contournement. Vous n'avez aucune idée du temps qui s'écoule entre le système appelant 'viewDidLoad' et' viewWillAppear'. –

+0

et quelle est la relation entre ce WA? Vous avez juste besoin d'avoir votre vue dans la pile, le comportement des threads sera exactement le même. Vous n'avez pas besoin d'avoir un indicateur de thread à partir de viewWillAppear pour appeler un autre VC. En tout cas, j'ai déclaré dans la réponse de changer la logique de ne pas l'utiliser. – GIJOW

+0

Merci les gars, mais apparemment le contrôleur de vue ouvre encore une seconde avant d'effectuer un segue à un autre contrôleur de vue, y at-il un moyen d'ignorer le contrôleur de vue et de sauter directement au contrôleur de vue que je veux? – Kinja

3

Vous ne pouvez pas appeler performSeugue de viewDidLoad. Vous devez l'appeler depuis viewDidAppear.

0

Je pense que probablement @Kinja essayait d'ignorer un contrôleur de vue particulier ici base sur un état particulier (archivé dans les valeurs par défaut de l'utilisateur) en essayant d'appeler performSegue dans la méthode viewDidLoad elle-même.

Je recommande d'essayer ci-dessous approche au lieu de faire performSegue-

How to load all view controllers storyboard, but skip the natural sequence and go direct to a specific view?

Espérons que cela aidera.

J'ai fait un exemple de code pour la démo du même @

git clone https://[email protected]/shreekara/viewcontrollers.git 

Vérifiez comment

let storyboard = UIStoryboard(name: "Main", bundle: nil) 

let viewcontroller2 = storyboard.instantiateViewController(withIdentifier: "view2") 
self.navigationController?.pushViewController(viewcontroller2, animated:false) 

let viewcontroller3 = storyboard.instantiateViewController(withIdentifier: "view3") 
self.navigationController?.pushViewController(viewcontroller3, animated:false) 
+0

oui vous avez tout à fait raison, apparemment effectuer un segue sera toujours ouvrir le particulier contrôleur d'abord avant de passer à un autre contrôleur que je ne veux vraiment pas.Savez-vous comment résoudre ce problème? ou ce lien hypertexte est la manière exacte? – Kinja

+0

@Kinja Le lien ci-dessus explique à peu près la même chose. Étant donné que le contrôleur de vue est programmé sur la base d'un état, vous devez suivre la même approche.Faites un exemple de projet pour démo le même.Veuillez vérifier @ https: //[email protected]/shreekara/viewcontrollers.git – Shreekara

+0

ermm je ne peux pas sembler aller à votre lien – Kinja

0

2 contrôleurs de vue sont directement peuplés La façon dont je semble être obligé de gérer cela est de créer un @objc selector, puis appelez cela depuis viewDidLoad() avec perform(). semble seulement travailler avec la version « afterDelay »:

@objc func showCompleted() { 
    self.performSegue(withIdentifier: "completed", sender: self) 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    var returnValue: Int = UserDefaults.standard.integer(forKey: "quiz1Validation") 
    if returnValue == 1 { 
    self.perform(#selector(self.showCompleted), with: nil, afterDelay: 0) 
    } 
    else { 
    // ...the rest of your code 
    } 
} 

On dirait un hack pour moi, alors j'aimerais entendre si quelqu'un d'autre a résolu ce d'une manière plus « Swifty ».