Swiftui 如何从QLThumbnailGenerator正确返回图像?(迅捷)

Swiftui 如何从QLThumbnailGenerator正确返回图像?(迅捷),swiftui,quicklook,Swiftui,Quicklook,我的问题 如何从QLHumbnailGenerator.shared.generateRepresentations(for:…)返回cgImage 我的挂断/尝试(代码如下) 我的尝试有一个函数(第13行),它返回ListView条目的CGImage(第39行)。我试图使用一个空的CGImage(第18行),但它的init参数令人困惑,对于一个简单的缩略图来说似乎太多了。我可能做得不对 注释 使用CGImage可以使相同的代码同时适用于iOS和macoscatalyst。(在WWDC 2019

我的问题 如何从QLHumbnailGenerator.shared.generateRepresentations(for:…)返回cgImage

我的挂断/尝试(代码如下) 我的尝试有一个函数(第13行),它返回ListView条目的CGImage(第39行)。我试图使用一个空的CGImage(第18行),但它的init参数令人困惑,对于一个简单的缩略图来说似乎太多了。我可能做得不对

注释 使用CGImage可以使相同的代码同时适用于iOS和macoscatalyst。(在WWDC 2019年第719次会议上看到了这一点。) 我试过,但未能从以下方面得到答案: - -

道歉/感谢 谢谢你的耐心,因为答案很可能是显而易见的,我的词汇量可能会减少。我愚蠢的大脑在没有一点实际操作经验的情况下调出了演讲,所以我从零编程知识作为一种业余爱好开始了第一个应用程序。之后我会回到理论课

ResultsView.swift



import SwiftUI
import MobileCoreServices
import Combine
import QuickLookThumbnailing
import CoreImage
import UIKit

struct ResultsView: View {
    @EnvironmentObject var parsedScreeningData: ParsedScreeningData
    @EnvironmentObject var search: Search

    func generateThumbnail(ofThis: String) -> CGImage {
        let url = self.search.libraryFolder.appendingPathComponent(ofThis)
        let size: CGSize = CGSize(width: 68, height: 88)
        let request = QLThumbnailGenerator.Request(fileAt: url, size: size, scale: (UIScreen.main.scale), representationTypes: .all)
        let generator = QLThumbnailGenerator.shared

        var image = CGImage()

        generator.generateRepresentations(for: request) { (thumbnail, type, error) in
            DispatchQueue.main.async {
                if thumbnail == nil || error != nil {
                    assert(false, "Thumbnail failed to generate")
                } else {
                    image = thumbnail!.cgImage
                }
            }
        }
        return image
    }



var body: some View {
    VStack{

        List(search.searchResults) { datum in
            HStack {
                Image(self.generateThumbnail(ofThis: datum.PDFname), scale: (UIScreen.main.scale), label: Text("PDF"))
                Text("File: \(datum.PDFname)")
                Text("Cell line: \(self.parsedScreeningData.parsedScreeningData[datum.termFoundIndex].misidentifiedCellLine)")
                    .padding(.trailing, 10)
                    .padding(.leading, 10)
                Spacer()
                Image(systemName: "eyeglasses").foregroundColor(ColorManager.iconGreen)
                } // HStack
            } // List
        }// Vstack
        .colorMultiply(ColorManager.beigeMedium)
            .padding(.trailing, 0)
            .padding(.leading, 0)
            .listStyle(GroupedListStyle())

    } // body
} // ResultsView struct


struct ResultsView_Previews: PreviewProvider {
    static var previews: some View {
        ResultsView().environmentObject(ParsedScreeningData()).environmentObject(Search())
    }
}


缩略图生成是异步的,所以它需要一些包装器视图,这些包装器视图等待生成显示一些存根占位符的缩略图,并在缩略图准备就绪时更新

这里有可能的解决办法

  • 缩略图持有者视图的使用
  • 缩略图视图本身
  • struct ThumbnailImageView:View{
    让url:url
    @国家私有变量缩略图:CGImage?=nil
    var body:一些观点{
    团体{
    如果缩略图!=零{
    图像(self.thumboil!),比例:(UIScreen.main.scale),标签:文本(“PDF”))
    }否则{
    
    Image(systemName:“photo”)//Where是
    generateThumbnail(of this:)
    调用的?@ChuckKrutsinger,in可以在占位符的
    中调用。
    
    List(search.searchResults) { datum in
        HStack {
            ThumbnailImageView(url: self.search.libraryFolder.appendingPathComponent(datum.PDFname))
            Text("File: \(datum.PDFname)")
    
            // ... other your code here
    
    struct ThumbnailImageView: View {
        let url: URL
    
        @State private var thumbnail: CGImage? = nil
    
        var body: some View {
            Group {
                if thumbnail != nil {
                    Image(self.thumbnail!, scale: (UIScreen.main.scale), label: Text("PDF"))
                } else {
                    Image(systemName: "photo") // << any placeholder
                      .onAppear(perform: generateThumbnail) // << here !! 
                }
            }
        }
    
        func generateThumbnail() {
            let size: CGSize = CGSize(width: 68, height: 88)
            let request = QLThumbnailGenerator.Request(fileAt: url, size: size, scale: (UIScreen.main.scale), representationTypes: .all)
            let generator = QLThumbnailGenerator.shared
    
            generator.generateRepresentations(for: request) { (thumbnail, type, error) in
                DispatchQueue.main.async {
                    if thumbnail == nil || error != nil {
                        assert(false, "Thumbnail failed to generate")
                    } else {
                        DispatchQueue.main.async { // << required !!
                            self.thumbnail = thumbnail!.cgImage  // here !!
                        }
                    }
                }
            }
        }
    }