2017-03-25 2 views
0

J'ai un UIViewController avec UIWebViewDelegate. J'ai trouvé que je peux le présenter très bien mais pas le pousser. Si j'essaie de le pousser, le contrôleur de vue cible charge et exécute n'importe quel jeu de variables, mais ne déclenche pas viewDidLoad() et retourne simplement à mon contrôleur de vue de menu appelant sans erreur.Swift 3. Peut présenter un UIViewController avec UIWebViewDelegate mais ne pas le pousser

J'ai défini un point d'arrêt sur la première déclaration var après la classe et j'ai parcouru le code. Quand il est arrivé à init WebView, il a flashé le contrôleur de la maison (pas la cible) dans le simulateur et ensuite continué les déclarations var avant de revenir à mon contrôleur de vue de la maison.

Voici mon code de menu

œuvres:

let myWebViewController = MyWebViewController() 

myWebViewController.urlString = "myUrl" 

present(myWebViewController, animated: true, completion: nil) 

ne fonctionne pas

let myWebViewController = MyWebViewController() 

myWebViewController.urlString = "myUrl" 

let navController = (UIApplication.shared.delegate as! AppDelegate).navController 

navController!.pushViewController(myWebViewController, animated: true) 

Voici mon expurgée code du contrôleur de vue cible. L'URL à charger est définie dans le menu.

import UIKit 

class MyWebViewController: UIViewController, UIWebViewDelegate { 

var urlString: String = "invalid url" 

var url: URL { 
    return URL(string: urlString)! 
} 

var urlRequest: URLRequest { 

    var urlRequest = URLRequest(url: url) 

    return urlRequest 
} 

let webView: UIWebView = { 
    let view = UIWebView() 
    view.backgroundColor = .white 
    view.translatesAutoresizingMaskIntoConstraints = false 
    return view 
}() 

// declare various buttons and stack views 

override func viewDidLoad() { 
    super.viewDidLoad() 

    webView.delegate = self 

    contentStackView.addArrangedSubview(webView) 

    mainStackView.addArrangedSubview(contentStackView) 

    view.addSubview(mainStackView) 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 

    webView.loadRequest(urlRequest as URLRequest) 
} 
+0

Pourriez-vous afficher plus de code? L'expression 'present (myWebViewController ...' est ou 'navController!pushViewController' n'a pas de sens si vous ne montrez pas d'où provient la variable 'myWebViewController' - et je suppose que quelque part, dans le code que vous n'avez pas montré, c'est _exactement_ la source du problème. - De même, revenez à travers tout votre code et faites en sorte que toutes les _classes commencent par une majuscule_. Donc, ce serait une variable 'myWebViewController' dont le type est' MyWebViewController'. – matt

+0

Le nom de la classe minuscule était une faute de frappe seulement ici. J'ai mis à jour ma question pour ajouter plus de code. – markhorrocks

+0

Étant donné que la vue cible commence à charger, je ne pense pas que le code de menu soit le problème, mais cela peut être faux. – markhorrocks

Répondre

1

Le problème n'a rien à voir avec l'affichage Web, le contrôleur Web ou tout autre élément, sauf lorsque vous appuyez sur le contrôleur de vue. Vous dites:

let navController = (UIApplication.shared.delegate as! AppDelegate).navController 
navController!.pushViewController(myWebViewController, animated: true) 

C'est très inhabituel. La chose habituelle est que nous sommes déjà à l'intérieur d'une interface de navigation, et nous pousser sur la pile:

let navController = self.navigationController 
navController!.pushViewController(myWebViewController, animated: true) 

Mais vous ne dites pas que. Pourquoi pas? Je suppose que c'est parce que self n'a pas ont un navigationController. Donc, vous réussissez à pousser sur le contrôleur de navigation, mais vous n'êtes pas voir quoi que ce soit qui se passe parce que le contrôleur de navigation est dans les coulisses - la vue du contrôleur self le bloque ou l'a remplacé.

Et cela explique pourquoi vous ne détectez jamais le chargement de l'URL. Votre appel au webView.loadRequest est en viewWillAppear. Mais cette vue n'apparaîtra pas ; c'est dans les coulisses. viewWillAppear n'est jamais appelé. De même viewDidLoad n'est pas appelé, parce que cette vue est pas va charger; le contrôleur de navigation n'occupe pas l'interface - self est.

+0

Je suis conscient que le contrôleur de vue appelant n'a pas de contrôleur de navigation, mais comment puis-je l'amener à l'avant avec le contrôleur de navigation racine? Merci pour l'aperçu supplémentaire de 'viewWillAppear()' Un point d'arrêt dans 'viewDidLoad()' montre qu'il n'est jamais déclenché non plus. – markhorrocks

+0

La sortie de l'appel du contrôleur de navigation délégué de l'application entraîne un blocage dû à zéro. Le menu latéral n'a pas de contrôleur de navigation et je ne vois pas comment il pourrait avoir à moins que je ne le cache qui ressemble à un hack. – markhorrocks

+0

"La suppression de l'appel du contrôleur de navigation délégué de l'application entraîne un blocage dû à zéro" Correct, car 'self' n'a pas de contrôleur de navigation, comme je l'ai dit. – matt

1

Je pourrais éventuellement penser à un scénario pour lequel le webViewController n'est pas poussé.

Le contrôleur UIView à partir duquel vous essayez d'effectuer le push peut ne pas faire partie de la hiérarchie du contrôleur de navigation.

Pourquoi vous essayez de ne pas utiliser le code au lieu d'obtenir le NavController de AppDelegate

self.navigationController?.pushViewController(myWebViewController, animated: true) 

Si cela ne fonctionne pas alors vous êtes certainement en train de faire quelque chose de mal.

+0

Cela se bloque. Je sais que le menu UITableView n'a pas de contrôleur de navigation. La question est de savoir comment en obtenir un pour la vue à charger? – markhorrocks

+0

Faites votre tableviewcontroller en tant que rootviewcontroller de UINavigationController et cela devrait fonctionner. –