Untitled
unknown
plain_text
8 months ago
4.9 kB
8
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