WKWebView в Swift не работает. Не показывает строку html

#ios #swift #uitableview #wkwebview

#iOS #swift #uitableview #wkwebview

Вопрос:

У меня есть WKWebView, включенный в ячейку табличного представления, который сам изменяет размер и заполняется с помощью контроллера с возможностью просмотра страниц. Его можно включать и отключать в зависимости от доставленной или нет строки html. Ячейка разработана программно.

Я настроил все, как показано во многих примерах, которые можно увидеть в Интернете., но он ничего не показывает, просто пробел. Я понятия не имею, что я делаю не так. Может быть, кто-нибудь может дать мне подсказку.

Вот части кода, касающиеся webview:

   private let webView:WKWebView = { () -> WKWebView in
    let webConfiguration = WKWebViewConfiguration()
    let webView = WKWebView(frame: .zero, configuration: webConfiguration)
    //webView.navigationDelegate = self
    webView.translatesAutoresizingMaskIntoConstraints = false
    return webView
}()

 func update(entity: Codable) {
    guard let news = entity as? NewsStream else {
        print("not a news stream!")
        return
    }
    if news.category == nil {
        news.category = news.widgetType
    }
    //Set global news variable
    self.news = news

    createWebView()
    }

 func createWebView(){
    webView.isHidden = true
    if let html = news?.html, let link = news?.webLink {
        if !html.isEmpty{
            webView.isHidden = false
            // let html2 = "<!DOCTYPE html><html><body><h1>My First Heading</h1><p>My first paragraph.</p></body></html>"
            webView.loadHTMLString(html, baseURL: Bundle.main.bundleURL)
            //        let myURL = URL(string: "https://www.apple.com")
            //                let myRequest = URLRequest(url: myURL!)
            //                webView.load(myRequest)
            webView.frame = CGRect(x: 0, y: currentYPos, width: contentView.frame.width, height: 400)
            currentYPos = currentYPos   webView.frame.height
            webView.backgroundColor = UIColor.green
            webView.tintColor = UIColor.orange
            webView.navigationDelegate = self
        }
    }
}

 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    
          self.webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
                    if complete != nil {
                        self.webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (height, error) in
                            self.webView.frame = CGRect(x: 0,
                                                        y: self.webView.frame.origin.y,
                                                        width:self.webView.frame.width,
                                                        height: height as! CGFloat)
                        })
                    }
    print("Webview Did load")
    print(webView.frame)
    })
}
  

Комментарии:

1. Можете ли вы показать код, который вы добавляете webViiew в свою ячейку?

2. Вероятно, ваш webview имеет неправильный (нулевой) размер. Вы говорите ему, что он должен использовать constraints ( translatesAutoresizingMaskIntoConstraints = false ), но затем вы устанавливаете frame и не устанавливаете никаких ограничений. Вы не должны устанавливать такие вещи, как scrollHeight вручную.

3. Не означает ли translatesAutoresizingMaskIntoConstraints = false, что он не должен использовать ограничения? Я добавляю все размеры вручную в эту ячейку, и это работает. У меня есть причины для этого. Ограничения не смогли правильно настроить макет (или я не смог настроить его правильно — неважно.) Для ячейки существует только одно ограничение. Больше ничего. Итак, почему вы думаете, что размер равен нулю? Я установил размер с рамкой на разные размеры для проверки. Закрытая область была видна, но внутри ничего не было

4. @koen, ты прав! Это действительно отсутствовало! Глупая ошибка….

Ответ №1:

Попробуйте использовать это.

 if let bodyText = news.bodyText {
            myWebview.loadHTMLString(bodyText, baseURL: nil)
 }
  

Комментарии:

1. Можете ли вы подробнее объяснить этот ответ? Похоже, предполагается, что есть bodyText свойство newStream . Я не вижу в коде ничего, что предполагало бы это. Есть ли что-то еще, что вы видите?

2. news.html на самом деле поставляет в тело html, как это: <!DOCTYPE html><html><body><h1>Мой Первый Заголовок</h1><p>Мой первый пункт.</p></body></html>