SwiftUI报错:PhotosSelector类型无imageSelection成员,求解决方案
问题原因与解决办法
错误根源
报错的直接原因是你的PhotosSelector结构体里根本没定义imageSelection这个属性,代码里写的self.imageSelection自然找不到对应的成员,编译器当然会报错。
这条guard语句原本的意图应该是避免处理过时的回调(比如用户刚选了A图还没处理完,又选了B图,此时A图的回调就该忽略),但你没在结构体里保存当前正在处理的图片项,才导致了这个问题。
修正方案(分两种场景)
场景1:单选图片(符合你按钮文字「Select a Photo」的需求)
把原来的数组类型选中项改成单个可选值,同时新增属性保存当前正在处理的图片项,代码修改如下:
struct PhotosSelector: View { @State private var selectedItem: PhotosPickerItem? @State private var currentProcessingItem: PhotosPickerItem? // 新增:保存当前处理的项 var body: some View { PhotosPicker(selection: $selectedItem, matching: .images) { Text("Select a Photo") } .onChange(of: selectedItem) { _, newItem in // 选中项变化时,调用加载方法 if let item = newItem { _ = loadTransferable(from: item) } } } func loadTransferable(from imageSelection: PhotosPickerItem) -> Progress { currentProcessingItem = imageSelection // 记录当前要处理的项 return imageSelection.loadTransferable(type: Image.self) { result in DispatchQueue.main.async { // 对比当前处理项和回调的项,不一致就忽略 guard self.currentProcessingItem == imageSelection else { return } switch result { case .success(let image?): print("Success.") case .success(nil): print("Success with empty value.") case .failure(let error): print("Failure: \(error.localizedDescription)") // 可以打印具体错误信息 } self.currentProcessingItem = nil // 处理完成后清空 } } } }
场景2:多选图片(如果需要支持选多张)
如果要保留数组类型的selectedItems,可以修改guard语句,判断当前项是否还在选中列表里(PhotosPickerItem默认遵循Equatable,可以直接用contains判断):
struct PhotosSelector: View { @State var selectedItems: [PhotosPickerItem] = [] var body: some View { PhotosPicker(selection: $selectedItems, matching: .images, photoLibrary: .shared()) { Text("Select Photos") } .onChange(of: selectedItems) { _, newItems in // 遍历新选中的项,逐个加载 for item in newItems { _ = loadTransferable(from: item) } } } func loadTransferable(from imageSelection: PhotosPickerItem) -> Progress { return imageSelection.loadTransferable(type: Image.self) { result in DispatchQueue.main.async { // 判断当前项是否还在选中列表中,不在就忽略回调 guard self.selectedItems.contains(imageSelection) else { return } switch result { case .success(let image?): print("Success.") case .success(nil): print("Success with empty value.") case .failure(let error): print("Failure: \(error.localizedDescription)") } } } } }
内容的提问来源于stack exchange,提问作者Carza104
相关产品推荐
相关产品推荐

