diff --git a/Pocket Poster.xcodeproj/project.pbxproj b/Pocket Poster.xcodeproj/project.pbxproj index 2029af0..ea27365 100644 --- a/Pocket Poster.xcodeproj/project.pbxproj +++ b/Pocket Poster.xcodeproj/project.pbxproj @@ -261,7 +261,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_ASSET_PATHS = "\"Pocket Poster/Preview Content\""; DEVELOPMENT_TEAM = 2P4CP47H76; ENABLE_PREVIEWS = YES; @@ -293,7 +293,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_ASSET_PATHS = "\"Pocket Poster/Preview Content\""; DEVELOPMENT_TEAM = 2P4CP47H76; ENABLE_PREVIEWS = YES; diff --git a/Pocket Poster/Views/ContentView.swift b/Pocket Poster/Views/ContentView.swift index 0198134..d084472 100644 --- a/Pocket Poster/Views/ContentView.swift +++ b/Pocket Poster/Views/ContentView.swift @@ -8,6 +8,12 @@ import SwiftUI import UniformTypeIdentifiers +extension UIDocumentPickerViewController { + @objc func fix_init(forOpeningContentTypes contentTypes: [UTType], asCopy: Bool) -> UIDocumentPickerViewController { + return fix_init(forOpeningContentTypes: contentTypes, asCopy: true) + } +} + struct ContentView: View { // Prefs @AppStorage("pbHash") var pbHash: String = "" @@ -102,6 +108,13 @@ struct ContentView: View { Text(lastError ?? "???") } } + + init() { + // Fix file picker + let fixMethod = class_getInstanceMethod(UIDocumentPickerViewController.self, #selector(UIDocumentPickerViewController.fix_init(forOpeningContentTypes:asCopy:)))! + let origMethod = class_getInstanceMethod(UIDocumentPickerViewController.self, #selector(UIDocumentPickerViewController.init(forOpeningContentTypes:asCopy:)))! + method_exchangeImplementations(origMethod, fixMethod) + } } #Preview { diff --git a/Pocket Poster/Views/FilePicker/FilePicker.swift b/Pocket Poster/Views/FilePicker/FilePicker.swift deleted file mode 100644 index c624256..0000000 --- a/Pocket Poster/Views/FilePicker/FilePicker.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// FilePicker.swift -// Pocket Poster -// -// Created by lemin on 6/1/25. -// - - -// FilePicker.swift -// -// MIT License -// -// Copyright (c) 2021 Mark Renaud -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import SwiftUI -import UniformTypeIdentifiers - -public struct FilePicker: View { - public typealias PickedURLsCompletionHandler = (_ urls: [URL]) -> Void - public typealias LabelViewContent = () -> LabelView - - @State private var isPresented: Bool = false - - public let types: [UTType] - public let allowMultiple: Bool - public let pickedCompletionHandler: PickedURLsCompletionHandler - public let labelViewContent: LabelViewContent - - public init(types: [UTType], allowMultiple: Bool, onPicked completionHandler: @escaping PickedURLsCompletionHandler, @ViewBuilder label labelViewContent: @escaping LabelViewContent) { - self.types = types - self.allowMultiple = allowMultiple - self.pickedCompletionHandler = completionHandler - self.labelViewContent = labelViewContent - } - - public init(types: [UTType], allowMultiple: Bool, title: String, onPicked completionHandler: @escaping PickedURLsCompletionHandler) where LabelView == Text { - self.init(types: types, allowMultiple: allowMultiple, onPicked: completionHandler) { Text(title) } - } - - public var body: some View { - Button( - action: { - if !isPresented { isPresented = true } - }, - label: { - labelViewContent() - } - ) - .disabled(isPresented) - .sheet(isPresented: $isPresented) { - FilePickerUIRepresentable(types: types, allowMultiple: allowMultiple, onPicked: pickedCompletionHandler) - } - } -} diff --git a/Pocket Poster/Views/FilePicker/FilePickerUIRepresentable.swift b/Pocket Poster/Views/FilePicker/FilePickerUIRepresentable.swift deleted file mode 100644 index a55119d..0000000 --- a/Pocket Poster/Views/FilePicker/FilePickerUIRepresentable.swift +++ /dev/null @@ -1,77 +0,0 @@ -// -// FilePickerUIRepresentable.swift -// Pocket Poster -// -// Created by lemin on 6/1/25. -// - - -// FilePicker Package -// -// MIT License -// -// Copyright (c) 2021 Mark Renaud -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import SwiftUI -import UniformTypeIdentifiers - -public struct FilePickerUIRepresentable: UIViewControllerRepresentable { - public typealias UIViewControllerType = UIDocumentPickerViewController - public typealias PickedURLsCompletionHandler = (_ urls: [URL]) -> Void - - @Environment(\.presentationMode) var presentationMode - - public let types: [UTType] - public let allowMultiple: Bool - public let pickedCompletionHandler: PickedURLsCompletionHandler - - public init(types: [UTType], allowMultiple: Bool, onPicked completionHandler: @escaping PickedURLsCompletionHandler) { - self.types = types - self.allowMultiple = allowMultiple - self.pickedCompletionHandler = completionHandler - } - - public func makeCoordinator() -> Coordinator { - Coordinator(parent: self) - } - - public func makeUIViewController(context: Context) -> UIDocumentPickerViewController { - let picker = UIDocumentPickerViewController(forOpeningContentTypes: types, asCopy: true) - picker.delegate = context.coordinator - picker.allowsMultipleSelection = allowMultiple - return picker - } - - public func updateUIViewController(_ controller: UIDocumentPickerViewController, context: Context) {} - - public class Coordinator: NSObject, UIDocumentPickerDelegate { - var parent: FilePickerUIRepresentable - - init(parent: FilePickerUIRepresentable) { - self.parent = parent - } - - public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { - parent.pickedCompletionHandler(urls) - parent.presentationMode.wrappedValue.dismiss() - } - } -} \ No newline at end of file