gpt4 book ai didi

ios - 如何从 SwiftUI 调用 PHPhotoLibrary presentLimitedLibraryPicker?

转载 作者:行者123 更新时间:2023-12-01 19:29:28 26 4
gpt4 key购买 nike

从 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com