Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI 2.0:使用.fileExporter修改器导出图像_Swiftui_Ios14_Xcode12_Macos Big Sur - Fatal编程技术网

SwiftUI 2.0:使用.fileExporter修改器导出图像

SwiftUI 2.0:使用.fileExporter修改器导出图像,swiftui,ios14,xcode12,macos-big-sur,Swiftui,Ios14,Xcode12,Macos Big Sur,目标:使用新的.fileExporter修改器使用SwiftUI导出图像 问题:目标图像未传递到.fileExporter文档 问题:如何获取.fileExporter修改器以导出图像 struct ContentView: View { @State private var openFile = false @State private var exportFile = false @State private var img1 = UIImage()

目标:使用新的.fileExporter修改器使用SwiftUI导出图像

问题:目标图像未传递到.fileExporter文档

问题:如何获取.fileExporter修改器以导出图像

struct ContentView: View {
    
    @State private var openFile = false
    @State private var exportFile = false


    @State private var img1 = UIImage()
    @State private var img2 = UIImage()

    @State private var target: Binding<UIImage>?    // dynamic target for importer
    
    var body: some View {
        Form {
            //image 1
            Button(action: {
                    self.target = $img1
                self.openFile.toggle()
            }){
                
                Image(uiImage: self.img1)
                .renderingMode(.original)
                .resizable()
                .frame(width: 48, height: 48)
                .clipShape(Circle())
            }
            
            //image 2
            Button(action: {
                    self.target = $img2
                self.openFile.toggle()
            }){
                
                Image(uiImage: self.img2)
                .renderingMode(.original)
                .resizable()
                .frame(width: 48, height: 48)
                .clipShape(Circle())
            }
        }
        .navigationTitle("File Importer")


        //file exporter not working. not sure what I should input as "document"
        .fileExporter(isPresented: $exportFile, document: target, contentType: .image) { result in
            if case .success = result {
                // Handle success.
            } else {
                // Handle failure.
            }
        }

        //file importer
        .fileImporter(isPresented: $openFile, allowedContentTypes: [.image]) { (res) in
            do{
                let fileUrl = try res.get()
                print(fileUrl)
                
                guard fileUrl.startAccessingSecurityScopedResource() else { return }
                if let imageData = try? Data(contentsOf: fileUrl),
                let image = UIImage(data: imageData) {
                    self.target?.wrappedValue = image
                }
                fileUrl.stopAccessingSecurityScopedResource()
                
            } catch{
                
                print ("error reading")
                print (error.localizedDescription)
            }
        }
    }
}
struct ContentView:View{
@State private var openFile=false
@State private var exportFile=false
@国家私有变量img1=UIImage()
@国家私有变量img2=UIImage()
@状态私有变量目标:绑定?//导入程序的动态目标
var body:一些观点{
形式{
//图1
按钮(操作:{
self.target=$img1
self.openFile.toggle()
}){
图像(uiImage:self.img1)
.renderingMode(.original)
.可调整大小()
.框架(宽度:48,高度:48)
.clipShape(圆())
}
//图2
按钮(操作:{
self.target=$img2
self.openFile.toggle()
}){
图像(uiImage:self.img2)
.renderingMode(.original)
.可调整大小()
.框架(宽度:48,高度:48)
.clipShape(圆())
}
}
.navigationTitle(“文件导入器”)
//文件导出器不工作。不确定应该输入什么作为“文档”
.fileExporter(显示:$exportFile,文档:target,contentType:.image){结果为
如果case.success=结果{
//处理成功。
}否则{
//处理失败。
}
}
//文件导入器
.fileImporter(显示:$openFile,allowedContentTypes:[.image]){(res)在
做{
让fileUrl=try res.get()
打印(文件URL)
guard fileUrl.startAccessingSecurityScopedResource()else{return}
如果让imageData=try?数据(contentsOf:fileUrl),
让image=UIImage(数据:imageData){
self.target?.wrappedValue=图像
}
fileUrl.stopAccessingSecurityScopedResource()的
}抓住{
打印(“错误读取”)
打印(错误。本地化描述)
}
}
}
}

我发现了一些代码问题和一些逻辑问题。以下是我编辑的版本:

struct ContentView: View {
    
    @State private var openFile = false
    @State private var exportFile = false


    @State private var img1 = UIImage(named: "0")!
    @State private var img2 = UIImage(named: "1")!

    @State private var target : UIImage?
    
    var body: some View {
        Form {
            //image 1
            Button(action: {
                self.target = img1
                self.exportFile.toggle()
                //self.openFile.toggle()
            }){
                
                Image(uiImage: self.img1)
                .renderingMode(.original)
                .resizable()
                .frame(width: 48, height: 48)
                .clipShape(Circle())
            }
            
            //image 2
            Button(action: {
                self.target = img2
                self.exportFile.toggle()
                //self.openFile.toggle()
            }){
                
                Image(uiImage: self.img2)
                .renderingMode(.original)
                .resizable()
                .frame(width: 48, height: 48)
                .clipShape(Circle())
            }
        }
        .navigationTitle("File Importer")

        .fileExporter(isPresented: $exportFile, document: ImageDocument(image: target), contentType: .png, onCompletion: { (result) in
            if case .success = result {
                print("Success")
            } else {
                print("Failure")
            }
        })


        //file importer
        .fileImporter(isPresented: $openFile, allowedContentTypes: [.image]) { (res) in
            do{
                let fileUrl = try res.get()
                print(fileUrl)
                
                guard fileUrl.startAccessingSecurityScopedResource() else { return }
                if let imageData = try? Data(contentsOf: fileUrl),
                let image = UIImage(data: imageData) {
                    self.target = image
                }
                fileUrl.stopAccessingSecurityScopedResource()
                
            } catch{
                
                print ("error reading")
                print (error.localizedDescription)
            }
        }
    }
}

struct ImageDocument: FileDocument {
    
    static var readableContentTypes: [UTType] { [.png] }

    var image: UIImage

    init(image: UIImage?) {
        self.image = image ?? UIImage()
    }

    init(configuration: ReadConfiguration) throws {
        guard let data = configuration.file.regularFileContents,
              let image = UIImage(data: data)
        else {
            throw CocoaError(.fileReadCorruptFile)
        }
        self.image = image
    }

    func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {
        return FileWrapper(regularFileWithContents: image.pngData()!)
    }
    
}
需要注意的事项:

  • 逻辑错误:您有一个
    exportFile
    状态变量,但从未修改过它。这意味着
    fileExporter
    永远不会出现
  • 您正在将
    绑定
    传递给需要
    文件文档
    的函数。我为图像编写了一个简单的
    FileDocument
    实现
  • 由于我将
    openFile
    切换为
    exportFile
    ,您现在没有任何
    openFile
    访问权限。这是一个合乎逻辑的决定,你需要弄清楚何时/如何触发它们
  • 我也没有对图像做任何错误处理,并决定将所有内容都视为PNG。你可能想做出不同的选择
  • 请注意,我还使用了名为“0”和“1”的图像——它们是特定于我的示例项目的。更改这些设置以适合您的项目


    如果您想要一种不同类型的解决方案,还可以使用
    \.exportFiles
    操作:

    谢谢!!!您知道如何在文件夹中导出多个图像吗?尝试过但没有成功…您必须编写自己的导出解决方案,而不是使用fileExporter。fileExporter一次只能处理一个文档()。这是假设您希望将它们作为单独的文件导出。如果您想将它们作为一个包导出,您可以考虑这样做——不过,这可能是一个很好的第二个问题,而不是一个我有专业知识的问题,再次感谢!我发布了另一个问题。目标是导出一个包含5个图像的文件夹