首页 > 解决方案 > .fileExporter 的使用

问题描述

我在我的代码中添加了一个 fileExporter,这样当用户单击导出按钮时,它会切换 $showingExporter 的值并期望显示 fileExporter。它工作正常,除了我发现无论是否单击我的按钮,它都会在我的情况下调用方法“CreateCSV”。每当我的视图关闭时,都会调用函数 CreateCSV。任何想法?

 var body: someView  {
       NavigationView {
          VStack {
              List {
                    Button(action: {self.showingExporter.toggle()}) {
                        Label("Export", systemImage: "square.and.arrow.up")
                    }
              }
                
            }.fileExporter(isPresented: $showingExporter, document: createCSV(), contentType: .plainText) { result in
                switch result {
                case .success(let url):
                    print("Saved to \(url)")
                case .failure(let error):
                    print(error.localizedDescription)
            }             
          }
       }
    }


private func createCSV() -> TextFile {
    print("CreateCSV")
 }

我发现每当我的视图消失时,它都会调用 createCSV() 一次。

标签: iosswiftswiftui

解决方案


SwiftUI 使用声明式语法,因此每当您的状态发生变化时,iOS 都会重绘视图。在您的情况下,当视图重绘时,您的函数 createCSV 将被调用,因为它的返回值是修饰符 fileExporter 的参数。要解决此问题,请为您的文档使用状态变量,将其作为参数传递给 fileExporter 并仅在文档准备好时切换值。

将您的代码修改为

@State private var showingExporter: Bool = false

@State private var document: TextFile?

var body: some View  {
   NavigationView {
      VStack {
          List {
                Button(action: {
                    document = createCSV()
                    self.showingExporter.toggle()
                }) {
                    Label("Export", systemImage: "square.and.arrow.up")
                }
          }
        }
          .fileExporter(isPresented: $showingExporter, document: document, contentType: .plainText) { result in
          switch result {
            case .success(let url):
                print("Saved to \(url)")
            case .failure(let error):
                print(error.localizedDescription)
            }
       }
   }
}

private func createCSV() -> TextFile {
    print("CreateCSV")
    // Return your text file
    return TextFile()
}

推荐阅读