我在我的应用程序中使用 SwiftUI 的 PhotosPicker,并试图找到一种方法来确保用户下次打开 PhotosPicker 时,所选元素的数量为零。
简单的兔子就是代码:
PhotosPicker(
selection: $selectedMediaitems,
selectionBehavior: .ordered,
photoLibrary: .shared()
) {
Image(.addIcon)
.resizable()
.frame(width: 60, height: 60)
}
据我了解,我需要在某个地方设置
selectedMediaitems = []
,但我不知道在哪里以及何时。如果我把它放在观察 selectedMediaitems 变化的函数中,我会得到一个无限的函数调用循环。
您实际上可以在使用这些图像后立即执行此操作。我将为您提供一个示例项目。我们首先启动应用程序,然后单击添加按钮来选择照片。我们选择一张或多张照片。当我们这样做时,我们可以单击显示照片,它将显示照片并使其成为 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: [])
}*