SplitViewController使用WKWebView内部更新详细视图

时间:2019-02-08 15:13:52

标签: swift wkwebview uisplitviewcontroller nslayoutconstraint

我有一个splitViewController,它显示怪物列表,并为每个怪物显示其信息和WkWebView。

enter image description here

我受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并重新寻址,但是同样的问题:(

我不明白为什么和我想念的东西。

0 个答案:

没有答案