#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>