Swift 3. 可以使用 UIWebViewDelegate 呈现 UIViewController 但不能推送它
Swift 3. Can present a UIViewController with UIWebViewDelegate but not push it
我有一个 UIViewController
和 UIWebViewDelegate
。我发现我可以很好地展示它,但不能推动它。如果我尝试推送它,目标视图控制器会加载并执行任何变量集,但不会触发 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)
如果这不起作用,那么你肯定做错了什么。
我有一个 UIViewController
和 UIWebViewDelegate
。我发现我可以很好地展示它,但不能推动它。如果我尝试推送它,目标视图控制器会加载并执行任何变量集,但不会触发 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)
如果这不起作用,那么你肯定做错了什么。