exitoffline
V2EX  ›  iOS

如何在 SwiftUI 里面实现一个 List View,其中每个 List 项是一个 WKWebView

  •  
  •   exitoffline · Aug 9, 2020 · 2667 views
    This topic created in 2126 days ago, the information mentioned may be changed or developed.

    我想在 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) {
        }
    }
    
    9 replies    2020-08-10 05:04:41 +08:00
    mcluyu
        1
    mcluyu  
       Aug 9, 2020
    不太懂 swiftUI,但是 webview 是比较耗性能的控件,你同时加载一堆肯定是不行的,你倒不如直接用一个 webview 加载 HTML 来实现你要的 list view 效果得了。
    imaning
        2
    imaning  
       Aug 9, 2020
    你为什么不把 html 放服务器上,然后去请求 URL?
    yov123456
        3
    yov123456  
       Aug 9, 2020
    html 也能渲染成 uilabel 或者有很多类似 yytext 的库能处理 不需要 webview
    scsb
        4
    scsb  
       Aug 10, 2020 via iPhone
    不太熟 ListView 但是你可以参考一下官方 SwiftUI 教程,里面似乎有提到这种
    exitoffline
        5
    exitoffline  
    OP
       Aug 10, 2020 via iPhone
    @yov123456 谢谢,我去研究一下。不光是显示富文本,yytext 也能显示图片吗
    exitoffline
        6
    exitoffline  
    OP
       Aug 10, 2020 via iPhone
    @mcluyu 谢谢,可能是耗资源太多,不能好多个一起用
    exitoffline
        7
    exitoffline  
    OP
       Aug 10, 2020 via iPhone
    @imaning 这是可行,但我主要还是想很多类型的 view 混排,不仅仅只是显示 webview
    exitoffline
        8
    exitoffline  
    OP
       Aug 10, 2020 via iPhone
    @leschans 我去看看,但好像官方没有这种说明
    exitoffline
        9
    exitoffline  
    OP
       Aug 10, 2020 via iPhone
    @yov123456 或者更进一步显示内嵌的可播放的视频。yytext 可能不支持 swiftui
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   922 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 22:24 · PVG 06:24 · LAX 15:24 · JFK 18:24
    ♥ Do have faith in what you're doing.