ios - 如何从 SwiftUI 调用 PHPhotoLibrary presentLimitedLibraryPicker?

标签 ios swiftui

从 SwiftUI 调用 PHPhotoLibrary 的 presentLimitedLibraryPicker 方法的正确方法是什么?
该方法需要一个 UIViewController,而我在 SwiftUI 中没有。
我尝试使用 UIViewControllerRepresentable 来创建 UIViewController,它可以工作,但结果是出现了两个 View Controller ,一个是我使用 UIViewControllerRepresentable 创建的,一个是有限库选择器。
两个 View Controller 都需要关闭才能到达原始屏幕,这是不可取的。
总结一下我看到的问题:

  • presentLimitedLibraryPicker 通过传递 ViewController 来工作。
  • 这让我创建并呈现了一个虚拟 ViewController,这样我就可以调用该方法。
  • 无法获得对有限库选择器的引用,它也不提供委托(delegate)。所以我无法检测到 Limited Library Picker Controller 何时被解除。

  • 这是我的尝试(它显示了选择器,但是当您关闭它时,您也需要关闭额外的虚拟 View Controller :
    import Foundation
    import SwiftUI
    import Photos
    import PhotosUI
    
    struct TestView: View {
    
       @State var showLibraryPicker = false
    
    var body: some View {
        NavigationView {
            VStack {
                Button("Open Library Picker") { showLibraryPicker = true }
            }
            .navigationBarTitle("Test", displayMode: .inline)
            .navigationViewStyle(StackNavigationViewStyle())
            .sheet(isPresented: $showLibraryPicker, onDismiss: { print("Dismissed") }) {
                TestLimitedLibraryPicker()
                }
            }
        }
    }
    
    
    struct TestLimitedLibraryPicker: UIViewControllerRepresentable {
    
         func makeUIViewController(context: Context) -> UIViewController {
             let controller = UIViewController()
             PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: controller)
              return controller
         }
    
        func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
    
         }
    }
    

    最佳答案

    这是一些演示方法。使用 Xcode 12/iOS 14 准备和测试。

    struct TestPhotosView: View {
    
        @State var showLibraryPicker = false
    
        var body: some View {
            NavigationView {
                VStack {
                    Button("Open Library Picker") { self.showLibraryPicker = true }
                }
                .navigationBarTitle("Test", displayMode: .inline)
                .navigationViewStyle(StackNavigationViewStyle())
                .background(Group {
                    if self.showLibraryPicker {
                        TestLimitedLibraryPicker(isPresented: $showLibraryPicker)
                    }
                })
            }
        }
    }
    
    
    struct TestLimitedLibraryPicker: UIViewControllerRepresentable {
        @Binding var isPresented: Bool
    
        func makeUIViewController(context: Context) -> UIViewController {
            let controller = UIViewController()
    
            DispatchQueue.main.async {
                PHPhotoLibrary.requestAuthorization() { result in
                    PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: controller)
                    context.coordinator.trackCompletion(in: controller)
                }
            }
            
            return controller
        }
    
        func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
    
        func makeCoordinator() -> Coordinator {
            Coordinator(isPresented: $isPresented)
        }
        class Coordinator: NSObject {
            private var isPresented: Binding<Bool>
            init(isPresented: Binding<Bool>) {
                self.isPresented = isPresented
            }
    
            func trackCompletion(in controller: UIViewController) {
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self, weak controller] in
                    if controller?.presentedViewController == nil {
                        self?.isPresented.wrappedValue = false
                    } else if let controller = controller {
                        self?.trackCompletion(in: controller)
                    }
                }
            }
        }
    }
    

    关于ios - 如何从 SwiftUI 调用 PHPhotoLibrary presentLimitedLibraryPicker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63870238/

    相关文章:

    ios - SwiftUI 中的淡入淡出图像似乎不起作用

    ios - Spotify SPTAuthViewController 问题

    ios - 在 MVVM 应用程序中访问核心数据堆栈

    ios - 如何最好地保持一个托管对象到另一个在 Swift 中保持同步的映射?

    ios - 在 MKMapView 上轮选位置

    swiftui - SwiftUI 中的全局警报

    ios - 获取点击手势的展开值