Swift 3. 可以使用 UIWebViewDelegate 呈现 UIViewController 但不能推送它

Swift 3. Can present a UIViewController with UIWebViewDelegate but not push it

我有一个 UIViewControllerUIWebViewDelegate。我发现我可以很好地展示它,但不能推动它。如果我尝试推送它,目标视图控制器会加载并执行任何变量集,但不会触发 viewDidLoad(),而只是 returns 到我的调用菜单视图控制器而不会出错。

我在 class 之后的第一个 var 声明上设置了一个断点并单步执行代码。当它到达 webView init 时,它在模拟器中闪现了主(非目标)视图控制器,然后在返回到我的主视图控制器之前继续通过 var 声明。

这是我的菜单代码

作品:

let myWebViewController = MyWebViewController()

myWebViewController.urlString = "myUrl"

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

无效

let myWebViewController = MyWebViewController()

myWebViewController.urlString = "myUrl"

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

navController!.pushViewController(myWebViewController, animated: true)

这是我编辑过的目标视图控制器代码。 URL在菜单中设置加载

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)
}

这个问题与 web 视图、web 视图控制器或其他任何东西无关,除了你推送视图控制器的地方。你是说:

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

这很不寻常。通常的情况是我们已经在导航界面中,然后我们压入它的堆栈:

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

但你不是这么说的。为什么不?我猜这是因为 self 没有 一个 navigationController。所以你成功地推到了导航控制器上,好吧,但是你没有看到任何事情发生,因为导航控制器在幕后—— self 视图控制器的视图正在阻止它或已替换它。

这就解释了为什么您从未检测到 url 加载。您拨打 webView.loadRequest 的电话是 viewWillAppear。但是这种观点不会出现;它在幕后。 viewWillAppear 永远不会被调用。同样,viewDidLoad 不会被调用,因为这个视图 不会 加载;导航控制器没有占用界面 — self 是。

我可能会想到一种情况,为什么 webViewController 没有被推送。

您尝试从中进行推送的 UIViewController 可能不是导航控制器层次结构的一部分。

为什么不尝试使用代码而不是从 AppDelegate 获取 navController

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

如果这不起作用,那么你肯定做错了什么。