2017-06-21 1 views
4

Quand j'écris comme ça, il fonctionne comme prévu:MBProgressHUD montrent pas

override func viewDidLoad() { 
    super.viewDidLoad() 
    MBProgressHUD.showAdded(to: navigationController!.view, animated: true) 
} 

Cependant, quand je l'ai mis dans le bloc DispatchQueue.main, le hud ne montre pas:

override func viewDidLoad() { 
    super.viewDidLoad() 

    DispatchQueue.main.async { 
     MBProgressHUD.showAdded(to: self.navigationController!.view, animated: true) 
    } 
} 

debugger la hiérarchie de la vue, et il y a un problème de mise en page:

« Position et la taille sont ambigus pour MBProgressHUD »

Le fichier navigationController est un contrôleur childViewController de fatherViewController et la vue du conteneur est définie par la mise en forme automatique dans la vue de fatherViewController.

Est-ce l'origine du problème?

+0

vous pouvez écrire 'self.view' au lieu de' self.navigationController! .view' ou avez-vous votre 'UINavigationCotroller' ajouté en story-board si vous avez de faire comme initialViewController connecter en tant que RootViewControlller que Essayez d'ajouter' self.navigationController! .view' – Dhiru

Répondre

3

J'ai construit une démo pour le tester, mais il n'a pas eu lieu. J'ai donc revérifié mon code et trouvé que j'ai mis du travail dans DispatchQueue.main.async qui bloque l'interface utilisateur et cause le problème.

2

je fis essai spécialement pour vous et le code suivant fonctionne pour moi:

override func viewDidLoad() { 
    super.viewDidLoad() 

    DispatchQueue.main.async { 
     MBProgressHUD.showAdded(to: self.navigationController!.view, animated: true) 
    } 
} 

Le problème est donc un autre endroit situé

+0

J'ai mis à jour la question. La navigationController est un childViewController et sa vue conteneur est définie par la mise en page automatique. Je pense que peut-être cela cause le problème. –

0

En fait, fonctionne MBProgressHUD sur thread principal interface utilisateur et que vous essayez de l'appeler en fil d'arrière-plan.

Essayez ceci: -

override func viewDidLoad() { 
     super.viewDidLoad() 
     DispatchQueue.main.async { start() 
} 
} 
func start(){ 


    MBProgressHUD.showAdded(to: self.navigationController!.view, animated: true)} 
+0

Il l'envoie au thread principal au lieu de l'arrière-plan. –

1

La géométrie de UIView racine est pas étant calculée (viewDidLayoutSubviews est pas appelé) au point de viewDidLoad. Je recommande de mettre votre code dans viewDidAppear. De plus, pas besoin d'appeler explicitement à l'intérieur DispatchAsync.main, comme d'autres l'ont est appelé dans le thread d'interface utilisateur, sauf si vous voulez l'appeler à partir du fil de fond.