首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI: PHPicker仍在加载

SwiftUI: PHPicker仍在加载
EN

Stack Overflow用户
提问于 2022-01-14 23:56:45
回答 1查看 591关注 0票数 0

我正在使用SwiftUI进行一个PHPicker项目。目前一切正常,除了每当我打开选择器时,都会收到警告[Picker] Showing picker unavailable UI (reason: still loading) with error: (null)

似乎选择器在被调用时没有完全初始化,实际上它在启动时显示Loading Photos...

有人知道怎么解决这个问题吗?

我的代码如下:

代码语言:javascript
复制
...
.toolbar {
    ToolbarItem {
        Button(action: {
            showingImagePicker = true
        }) {
            Label("Add Image", systemImage: "plus")
        }
    }
}
.sheet(isPresented: $showingImagePicker) {
    ImagePickerRepresentable(
        showImagePicker: $showingImagePicker,
        onCompletion: complete
    )
}

这是我的ImagePickerRepresentable

代码语言:javascript
复制
struct ImagePickerRepresentable: UIViewControllerRepresentable {
    // MARK: - Environment Object
    @Binding var showImagePicker: Bool
    let onCompletion: (UIImage) -> Void
    
    // MARK: - Coordinator Class
    final class Coordinator: PHPickerViewControllerDelegate {
        private let parent: ImagePickerRepresentable
        
        init(_ parent: ImagePickerRepresentable) {
            self.parent = parent
        }
        
        func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
            parent.showImagePicker = false

            // unpack the selected items
            let itemProviders = results.map(\.itemProvider)
            for itemProvider in itemProviders {
                if itemProvider.canLoadObject(ofClass: UIImage.self) {
                    itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error in
                        if let image = image as? UIImage {
                            self?.parent.onCompletion(image)
                        }
                    }
                } else {
                    print("Can't load object")
                }
            }
        }
    }
    
    func makeUIViewController(context: Context) -> PHPickerViewController {
        var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
        configuration.filter = .images // filter only to images
        configuration.selectionLimit = 3
        
        let controller = PHPickerViewController(configuration: configuration)
        controller.delegate = context.coordinator // Use Coordinator for delegation
        return controller
    }
    
    func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) { }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
}

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2022-01-15 10:01:09

我测试了您的代码,得到了相同的错误,但仍然有效。

如果愿意,可以使用我的选择器版本(元数据变量仅用于Firebase):

代码语言:javascript
复制
import Foundation
import SwiftUI
import PhotosUI

struct PHPicker: UIViewControllerRepresentable {
    
    //    var didFinishPicking: (_ didSelectItems: Bool) -> Void
    
    @Binding var images: [UIImage]
    @Binding var picker: Bool
    @Binding var imageData: [Data]
    
    var selectionLimitation: Int {
        return 5 - images.count
    }
    
    func makeCoordinator() -> Coordinator {
        return PHPicker.Coordinator(with: self)
    }
    
    
    func makeUIViewController(context: Context) -> PHPickerViewController {
        
        var config = PHPickerConfiguration()
        // can also select videos
        config.filter = .images
        config.selectionLimit = selectionLimitation
        config.preferredAssetRepresentationMode = .current
        let picker = PHPickerViewController(configuration: config)
        picker.delegate = context.coordinator
        return picker
    }
    
    func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {
        
    }
    
    class Coordinator: NSObject, PHPickerViewControllerDelegate {
        
        var photoPicker: PHPicker
        
        init(with photoPicker: PHPicker) {
            self.photoPicker = photoPicker
        }
        
        func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
            
            //            photoPicker.didFinishPicking(!results.isEmpty)
            
            // Closing picker
            
            photoPicker.picker.toggle()
            
            for img in results {
                
                if img.itemProvider.canLoadObject(ofClass: UIImage.self) {
                    
                    img.itemProvider.loadObject(ofClass: UIImage.self) { object, err in
                        
                        if let image = object as? UIImage {
                            if let mediaData = image.jpegData(compressionQuality: 0.5) {
                                DispatchQueue.main.async {
                                    self.photoPicker.images.append(image)
                                    self.photoPicker.imageData.append(mediaData)
                                }
                            }
                        }
                        
                        
                        
                    }
                    
                } else {
                    // Error loading
                    print("Cannot be loaded")
                    
                }
            }
       
            
        }
        
        
    }
}

经以下测试:

代码语言:javascript
复制
import SwiftUI

struct ContentView: View {
    
    @State var showingImagePicker = false
    @State var images: [UIImage] = []
    @State var imagesData: [Data] = []
    
    
    var body: some View {
        NavigationView {
            VStack {
                if !images.isEmpty {
                   
                    ForEach(images, id:\.self) { img in
                        Image(uiImage: img)
                            .resizable()
                            .scaledToFit()
                    }
                    
                }
                    
            }
            .toolbar {
                ToolbarItem {
                    Button(action: {
                        showingImagePicker = true
                    }) {
                        Label("Add Image", systemImage: "plus")
                    }
                }
            }
            .sheet(isPresented: $showingImagePicker) {
//                ImagePickerRepresentable(
//                    showImagePicker: $showingImagePicker,
//                    onCompletion: complete
//                )
                PHPicker(images: $images, picker: $showingImagePicker, imageData: $imagesData)
            }
        }
        
    }
    
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70717766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档