ios - .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() 一次。
解决方案
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()
}
推荐阅读
- contract - 合同验证错误:originEnergyLimit 必须 > 0。Tron ide 错误
- python-3.x - 如何停止在此单元格中打印图表,但下一个单元格的代码非常短
- reactjs - 嵌套应用程序的 IIS URL 重写
- javascript - 在 Chrome 和 Firefox 中调整图像大小时 contenteditable="true" 属性不适用于图像标签的解决方案
- python - PyPDF2.utils.PdfReadError:文件尚未解密
- java - 使用 SceneBuilder 在 JavaFX 项目开始时调用函数
- c++ - 谁能解释这个图像分辨率设置代码?到底发生了什么
- java - 在阻止模式下拨打电话
- c++ - 如何使用 Fast-LZMA2 压缩/解压缩缓冲区
- python - Anaconda导入错误,循环导入错误