我有一个splitViewController,它显示怪物列表,并为每个怪物显示其信息和WkWebView。
我受raywenderlich tuto的启发编写了splitViewController逻辑。
protocol DetailSelectionDelegate: class {
func monsterSelected(newMonster: Monster)
}
class MasterViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISplitViewControllerDelegate, UIScrollViewDelegate, CAAnimationDelegate, WKNavigationDelegate, WKUIDelegate, UINavigationControllerDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let monsters : Monster = self.allMonstersArray[indexPath.row] as! Post
delegate?.monsterSelected(newMonster:monster)
self.tableView.deselectRow(at: indexPath, animated: false)
}
}
extension DetailViewController: DetailSelectionDelegate {
func monsterSelected(newMonster: Monster) {
monster = newMonster
}
}
class DetailViewController: UIViewController, UIScrollViewDelegate, WKUIDelegate, WKNavigationDelegate {
var monster: Monster? {
didSet {
refreshUI()
}
}
func refreshUI() {
loadViewIfNeeded()
nameLabel.text = monster?.name
descriptionLabel.text = monster?.description
self.webView.loadHTMLString(monster!.setContentHtml(), baseURL: Bundle.main.resourceURL)
}
override func loadView() {
super.loadView()
self.webView = WKWebView()
if (self.webView != nil) {
self.webView!.frame = self.webviewContainer.frame
self.webView.uiDelegate = self
self.webView.navigationDelegate = self
self.webView.translatesAutoresizingMaskIntoConstraints = false
self.webView.scrollView.isScrollEnabled = false
self.webView.scrollView.bounces = false
self.webView.scrollView.bouncesZoom = false
self.webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
if #available(iOS 11.0, *) {
self.webView.scrollView.contentInsetAdjustmentBehavior = .never
}
self.webviewContainer.addSubview(self.webView!)
NSLayoutConstraint.activate([
self.webView.topAnchor.constraint(equalTo: self.webviewContainer.topAnchor),
self.webView.bottomAnchor.constraint(equalTo: self.webviewContainer.bottomAnchor),
self.webView.leadingAnchor.constraint(equalTo: self.webviewContainer.leadingAnchor),
self.webView.trailingAnchor.constraint(equalTo: self.webviewContainer.trailingAnchor)
])
}
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
DispatchQueue.main.async(execute: {
self.heightWebviewConstraint.constant = self.webView.scrollView.contentSize.height
self.view.setNeedsLayout()
self.view.setNeedsUpdateConstraints()
})
}
}
使用上面的代码,当应用启动时,一切正常,第一个怪物的wkwebview正确显示,其高度确定。
当应用程序调用didSelectRowAt显示另一个怪物时,新怪物的所有内容都会更新,其中包括wkwebview。 但是新的wkwebview具有先前怪物的高度。它的高度没有更新。
我试图从超级视图中删除wkwebview并重新寻址,但是同样的问题:(
我不明白为什么和我想念的东西。