SwiftUI PhotosPicker 如何在选择完成后清除所选项目列表

问题描述 投票:0回答:1

我在我的应用程序中使用 SwiftUI 的 PhotosPicker,并试图找到一种方法来确保用户下次打开 PhotosPicker 时,所选元素的数量为零。

简单的兔子就是代码:

PhotosPicker(
            selection: $selectedMediaitems,
            selectionBehavior: .ordered,
            photoLibrary: .shared()
        ) {
            Image(.addIcon)
                .resizable()
                .frame(width: 60, height: 60)
        }

据我了解,我需要在某个地方设置

selectedMediaitems = []
,但我不知道在哪里以及何时。如果我把它放在观察 selectedMediaitems 变化的函数中,我会得到一个无限的函数调用循环。

swift swiftui photospicker
1个回答
0
投票

您实际上可以在使用这些图像后立即执行此操作。我将为您提供一个示例项目。我们首先启动应用程序,然后单击添加按钮来选择照片。我们选择一张或多张照片。当我们这样做时,我们可以单击显示照片,它将显示照片并使其成为 selectedMediaitems = []。这样当我们再次选择照片时,我们就不会再有任何预先选择的照片了。

*import SwiftUI
import Photos
import PhotosUI
struct ContentView: View {
    @State var selectedMediaitems:[PhotosPickerItem]
    @State var selectedImages = [Image]()
    
    
   
    func loadImages() {
        for item in selectedMediaitems {
            item.loadTransferable(type: Data.self) { result in
                DispatchQueue.main.async {
                    switch result {
                    case .success(let data):
                        if let data = data, let image = UIImage(data: data) {
                            self.selectedImages.append(Image(uiImage: image))
                        } else {
                            print("No image data available or image conversion failed.")
                        }
                    case .failure(let error):
                        print("Error loading image: \(error.localizedDescription)")
                    }
                    selectedMediaitems = []
                }
            }
        }
        
    }
    
    var body: some View {
        VStack{
            PhotosPicker(
                selection: $selectedMediaitems,
                selectionBehavior: .ordered,
                photoLibrary: .shared()
            ) {
                Image(systemName: "plus")
                    .resizable()
                    .frame(width: 60, height: 60)
            }
            
            Button(action: {
               loadImages()
            }, label: {
                Text("Display image")
            })
            
            List {
                ForEach(0..<selectedImages.count, id: \.self) { index in
                   selectedImages[index]
                        .resizable()
                        .frame(width: 100, height: 100)
                }
            }
        }
        
    }
}
#Preview {
    ContentView(selectedMediaitems: [])
}*
© www.soinside.com 2019 - 2024. All rights reserved.