SplitViewController обновляет детальный вид с помощью WKWebView внутри - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть 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 из суперпредставления и переадресовать его, но та же проблема: (

Я не понимаю, почему и чего мне не хватает.

...