【问题标题】:How to change @State property wrapper from nested view如何从嵌套视图更改@State 属性包装器
【发布时间】:2020-05-22 23:55:58
【问题描述】:

我想知道如何在下面的视图中更改@State 属性包装器 showErrorAlert

struct SettingsView: View {
@State private var shouldPresent = false
@State var showErrorAlert = false
var body: some View {
    VStack {
        Form {
            Text("Settings")
                .font(.title)
            Button("Import source data") {
                self.shouldPresent.toggle()
            }
            .sheet(isPresented: $shouldPresent) {
                DocumentPicker()
            }
            Button("Show error alert") {
                self.showErrorAlert.toggle()
            }
            .alert(isPresented: $showErrorAlert, content: {
                Alert(title: Text("Error"))
            })
        }
    }
}
}

来自 DocumentPicker 结构代码,以防读取所选文件失败。

struct DocumentPicker: UIViewControllerRepresentable {

func makeCoordinator() -> DocumentPicker.Coordinator {
    return DocumentPicker.Coordinator(parent: self)
}

func makeUIViewController(context: UIViewControllerRepresentableContext<DocumentPicker>) -> UIDocumentPickerViewController {
    let picker = UIDocumentPickerViewController(documentTypes: [String(kUTTypeJSON)], in: .import)
    picker.allowsMultipleSelection = false
    picker.delegate = context.coordinator
    return picker
}

func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: UIViewControllerRepresentableContext<DocumentPicker>) {
}

class Coordinator: NSObject, UIDocumentPickerDelegate {

    var myParent: DocumentPicker
    init(parent: DocumentPicker) {
        myParent = parent
    }

    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        let fileURL = urls.first!
        do {
            let origFile = try String(contentsOf: fileURL)
            //File processing will be here
        } catch let error {
            print(error)
        }
    }
}
}

我的意思是如何将属性包装器值设置为 true 以显示警报。我应该改用@ObservedObject 还是@EnvironmentObject? 谢谢。

【问题讨论】:

    标签: state swiftui property-wrapper


    【解决方案1】:

    要更改 DocumentPicker 结构中的包装器值,您可以定义一个 @Binding 变量并将您的值传递给它,这会在您的父视图上切换您的变量,但在显示警报之前您需要关闭 DocumentPicker

    【讨论】:

    • 如果我在 DocumentPicker 结构中声明 @Binding var isPresented = false 我收到错误“参数标签 '(wrappedValue:)' 不匹配任何可用的重载”
    • 你的@Binding变量不需要设置值,你应该定义@Binding var isPresented: Bool
    • 对。以及如何将 func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) 中的 isPresented 变量设置为 true 以显示警报?如果我在 do-catch 中尝试 isPresented = true,编译器会说“'DocumentPicker' 类型的实例成员 'isPresented' 不能用于嵌套类型 'DocumentPicker.Coordinator' 的实例”。
    • 调用 myParent.isPresented = true 应该在 catch 块中工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2011-11-15
    • 2021-10-19
    • 2020-05-12
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多