我想在 SwiftUI 里面实现一个 List View,其中每一个 list 项就是一个 WKWebView 。就像一个论坛的帖子,每个跟帖就是一个 list 项目,每个跟帖的数据是一个 html 字符串,可能里面有图片或其他东西。
但是我的代码实现(在最末尾是全部代码)加载速度超级慢。如果往下滑动,好多项目还没加载,如果再往上滑动,加载的项目也没有了。伴随有很多错误。就像这样的
2020-08-08 22:44:15.493387-0700 WKWebViewTest[2205:76254] WF: === Starting WebFilter logging for process WKWebViewTest 2020-08-08 22:44:15.493682-0700 WKWebViewTest[2205:76254] WF: _userSettingsForUser : (null) 2020-08-08 22:44:15.493865-0700 WKWebViewTest[2205:76254] WF: _WebFilterIsActive returning: NO 2020-08-08 22:44:15.622585-0700 WKWebViewTest[2205:76254] WF: _userSettingsForUser : (null) 2020-08-08 22:44:15.622787-0700 WKWebViewTest[2205:76254] WF: _WebFilterIsActive returning: NO
我不知道究竟如何才能实现这样一个功能。请大神赐教
import SwiftUI
import WebKit
struct ContentView: View {
init() {
UITableView.appearance().separatorStyle = .none
UITableViewCell.appearance().selectionStyle = .none
UITableViewCell.appearance().backgroundColor = UIColor.clear
UITableView.appearance().backgroundColor = UIColor.clear
}
let htmlText = "<p>This is the paragraph</p>"
var body: some View {
List{
ForEach(0...20, id: \.self) { _ in
VStack {
PostWebView(text: self.htmlText)
.frame(height: 50)
Divider()
}
}
}
.listRowInsets(.init(top: 0, leading: 0, bottom: 0, trailing: 0))
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct PostWebView : UIViewRepresentable {
let text: String
init(text: String) {
self.text = text
}
class Coordinator: NSObject, WKNavigationDelegate {
var parent: PostWebView
init(_ parent: PostWebView) {
self.parent = parent
}
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func makeUIView(context: Context) -> WKWebView {
let webview = WKWebView()
webview.scrollView.bounces = false
webview.scrollView.isScrollEnabled = false
webview.navigationDelegate = context.coordinator
let htmlStart = "<HTML><HEAD><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, shrink-to-fit=no, maximum-scale=1.0, user-scalable=no\"></HEAD><BODY>"
let htmlEnd = "</BODY></HTML>"
let postHtml = text
let htmlString = "\(htmlStart)\(postHtml)\(htmlEnd)"
webview.loadHTMLString(htmlString, baseURL: nil)
return webview
}
func updateUIView(_ uiView: WKWebView, context: Context) {
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.