2017-10-03 4 views
2

dans la viewDidLoad()UIViewController il existe une méthode appelée pour mettre à jour une variable de classe. Une fois que je navigue vers un autre contrôleur de vue et que je reviens à celui-ci, les méthodes de délégué de UITableView sont appelées en premier où cette variable de classe est utilisée. App plante parce que cette variable est en cours de construction dans viewDidLoad(). Comment ce problème peut-il être résolu? Je vous remercie.Les méthodes déléguées UITableView appelées avant viewDidLoad()

la variable de classe en question:

var showHideDict = Dictionary<Int, Bool>() 

le viewDidLoad():

override func viewWillAppear() { 
    super.viewWillAppear() 
    makeAPICall() 
} 

l'API méthode d'appel:

func makeAPICall() { 
    // create helper object 
    let helper = ModelHelper() 
    helper.createModels(receivedDict: result! as NSDictionary) 

      // store the showHideDict 
    for index in 0...(Modelclass.models.count - 1) { 
     self.showHideDict[index] = true 
    } 

    DispatchQueue.main.async { 
     self.tableView.reloadData() 
    } 
} 
+1

en publiant du code ne paraphrasant pas votre code dans les phrases. Jusqu'à présent, il semble que cela devrait fonctionner soit hors de la boîte ou un duplicata de https://stackoverflow.com/questions/46521391/xcode-swift-viewdidload – luk2302

+0

ajouté le code au lieu de paraphraser. Merci d'avoir répondu. –

+0

Pourquoi appelez-vous 'viewWillAppear()'? Cela ne devrait-il pas être 'super.viewWillAppear()'? – toddg

Répondre

3

Dans vos méthodes UITableViewDelegate Je pense que vous voulez vérifiez si les données de votre dictionnaire sont renseignées comme vous le souhaitez . Par exemple, voici ce que je fais souvent dans mon code:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    return tableData?.count ?? 0 
} 

ce qui veut dire: si tableData est non nul, puis retourne le nombre d'éléments du tableau. Sinon retour 0

Puis dans votre cellForRowAt méthode, juste conditionnellement vérifier si les données dans votre showHideDict sont remplis comme prévu, sinon ne pas forcer déplier. Swift renforce la sécurité avec les options ... travailler avec ça n'est pas contre. Une fois votre appel d'API terminé, tout ce que vous devez faire est de faire tableView.reloadData() et le tableau sera construit avec vos données nouvellement remplies.

+1

cette solution a bien fonctionné pour moi! plus tôt, je ne vérifiais pas si les données de l'API avaient été reçues ou non. Comme vous l'avez indiqué à juste titre dans votre réponse, la clé était de le vérifier dans 'numberOfRowsInSection' et de recharger les données de la table dans' cellForRow'. Je vous remercie! –