2017-10-06 11 views
1

J'utilise xcode 9/swift 4. J'ai un simple UIViewController avec un WKWebView comme une prise.Pourquoi UIActivityIndicatorView! nul quand déballé?

class WebViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { 

     @IBOutlet weak var webView: WKWebView! 

     var spinner:UIActivityIndicatorView! 

     override func loadView() 
     { 
      let webConfiguration = WKWebViewConfiguration() 
      webView = WKWebView(frame: .zero, configuration: webConfiguration) 
      webView.navigationDelegate = self 
      webView.uiDelegate = self 
      view = webView 

     } 

override func viewDidLoad() { 
     super.viewDidLoad() 
     spinner = UIActivityIndicatorView() 
     webView.addSubview(spinner) 
     spinner.center = self.webView.center 
     spinner.hidesWhenStopped = true 
     spinner.isHidden = true 
} 

Tout d'abord, j'ai essayé glisser le UIActivityViewIndicator du story-board comme un exutoire mais toujours juste gardé la moindre erreur chaque fois que j'essayé de faire quoi que ce soit par exemple. spinner.hidesWhenStopped disant qu'il était nul quand déballé. Puis j'ai essayé de créer un spinner par programmation, mais je n'arrive pas à le montrer non plus. Je devine que je fais une erreur en pensant que je peux ajouter le fileur sur le webView par exemple. webView.addSubview (spinner).

Merci.

Répondre

2
  1. Vous avez un webView qui est une sortie, mais vous êtes aussi dans ce crée loadView. Si c'est un débouché pour quelque chose que vous avez créé dans le Storyboard, alors vous ne devriez pas le faire.

  2. La WebView que vous avez créée possède une image de .zero. Sur viewDidLoad, c'est probablement encore .zero (check) - dans ce cas, le spinner est à 0,0.

  3. Vous pourriez faire du filateur une sortie. Sachez simplement qu'il ne devient utilisable que dans viewDidLoad ou after et non dans loadView (que vous ne devez normalement pas remplacer lors de l'utilisation d'un Storyboard). Si vous l'avez fait dans ce code, vous avez empêché le storyboard de se charger. Vous pouvez appeler super.loadView(), mais je ne voudrais même pas passer outre.

C'est ce que je ferais:

  1. Débarrassez-vous de votre loadView.
  2. Rendre le webView un enfant normal de self.view - n'essayez pas d'afficher la vue.
  3. Ajouter la fileuse comme sortie
  4. uniquement accéder à la spinner dans viewDidLoad ou plus tard
  5. Utilisez autolayout pour positionner et tout taille (ne sont pas seulement central fixé)

(ou si vous étiez vraiment mis sur loadview et obtenir en vue d'être webView)

  1. Débarrassez-vous de la table de montage et de faire tout ce programme
  2. Définir la position le spinner quand vous savez que webView a une taille (utilisez la mise en page automatique pour que tout cela se fasse automatiquement).