Untitled
unknown
plain_text
a month ago
4.9 kB
6
Indexable
// MARK: - QLPreviewWrapper struct QLPreviewWrapper: UIViewControllerRepresentable { let url: URL let onSave: () -> Void let onClose: () -> Void func makeUIViewController(context: Context) -> some UIViewController { return QLPreviewAsClass(url: url, onSave: onSave, onClose: onClose) } func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { } } // MARK: QLPreviewAsClass final class QLPreviewAsClass: UIViewController, QLPreviewControllerDataSource, @preconcurrency QLPreviewControllerDelegate { let url: URL let onSave: () -> Void let onClose: () -> Void var qlController: QLPreviewController? required init?(coder: NSCoder) { fatalError("no supported") } init(url: URL, onSave: @escaping () -> Void, onClose: @escaping () -> Void) { self.url = url self.onSave = onSave self.onClose = onClose super.init(nibName: nil, bundle: nil) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if qlController == nil { qlController = QLPreviewController() guard let qlController else { return } qlController.dataSource = self qlController.delegate = self present(qlController, animated: false) } } func numberOfPreviewItems(in controller: QLPreviewController) -> Int { return 1 } func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem { return url as QLPreviewItem } func previewController(_ controller: QLPreviewController, editingModeFor previewItem: any QLPreviewItem) -> QLPreviewItemEditingMode { return .createCopy } func previewController(_ controller: QLPreviewController, didSaveEditedCopyOf previewItem: QLPreviewItem, at modifiedContentsURL: URL) { _ = try? FileManager.default.replaceItemAt(url, withItemAt: modifiedContentsURL) NotificationCenter.default.post(name: Notification.Name("modifiedContentsURL"), object: nil) onSave() } func previewControllerWillDismiss(_ controller: QLPreviewController) { dismiss(animated: false) } } // MARK: - QLPreview struct QLPreview: UIViewControllerRepresentable { let url: URL let onSave: () -> Void let onClose: () -> Void init( url: URL, onSave: @escaping () -> Void, onClose: @escaping () -> Void ) { self.url = url self.onSave = onSave self.onClose = onClose } func makeUIViewController(context: Context) -> UINavigationController { let editor = QLPreviewController() editor.dataSource = context.coordinator editor.delegate = context.coordinator editor.setEditing(true, animated: false) let doneAction = UIAction { _ in doneButtonTapped() } let doneButton = UIBarButtonItem(systemItem: .done, primaryAction: doneAction) let controller = UINavigationController(rootViewController: editor) editor.navigationItem.rightBarButtonItem = doneButton return controller } func updateUIViewController(_ uiViewController: UINavigationController, context: Context) { } private func doneButtonTapped() { onClose() } // Coordinator func makeCoordinator() -> Coordinator { return Coordinator(self) } final class Coordinator: NSObject, QLPreviewControllerDataSource, @preconcurrency QLPreviewControllerDelegate { var parent: QLPreview init(_ parent: QLPreview) { self.parent = parent } func numberOfPreviewItems(in controller: QLPreviewController) -> Int { return 1 } func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem { print("Preview item at: \(parent.url)") return parent.url as QLPreviewItem } func previewController(_ controller: QLPreviewController, editingModeFor previewItem: any QLPreviewItem) -> QLPreviewItemEditingMode { return .createCopy } func previewController(_ controller: QLPreviewController, didUpdateContentsOf previewItem: QLPreviewItem) { print("UPDATE") } func previewController(_ controller: QLPreviewController, didSaveEditedCopyOf previewItem: QLPreviewItem, at modifiedContentsURL: URL) { // print("SAVED at \(modifiedContentsURL)") _ = try? FileManager.default.replaceItemAt(parent.url, withItemAt: modifiedContentsURL) NotificationCenter.default.post(name: Notification.Name("modifiedContentsURL"), object: nil) parent.onSave() } } }
Editor is loading...
Leave a Comment