feat: 优化AppSettingView和ImagePicker组件以增强图片选择体验

- 在AppSettingView中添加详细的日志记录,便于调试和用户反馈。
- 改进图片加载逻辑,确保在加载失败时提供用户友好的错误提示。
- 在ImagePickerWithPreview组件中使用主线程更新UI,提升响应速度。
- 更新错误弹窗逻辑,确保在用户确认后关闭所有相关弹窗,优化用户体验。
This commit is contained in:
edwinQQQ
2025-07-26 09:43:10 +08:00
parent ac0d622c97
commit bc96cc47ff
3 changed files with 47 additions and 8 deletions

View File

@@ -53,9 +53,20 @@ struct AppSettingView: View {
)
.sheet(isPresented: $showCamera) {
CameraPicker { image in
print("[LOG] CameraPicker回调image: \(image != nil)")
if let image = image {
selectedImages = [image]
showPreview = true
print("[LOG] CameraPicker获得图片直接上传头像")
if let data = image.jpegData(compressionQuality: 0.8) {
viewStore.send(AppSettingFeature.Action.avatarSelected(data))
}
} else {
errorMessage = "拍照失败,请重试"
//
showPreview = false
showCamera = false
showPhotoPicker = false
showActionSheet = false
print("[LOG] CameraPicker无图片弹出错误提示")
}
showCamera = false
}
@@ -65,17 +76,20 @@ struct AppSettingView: View {
images: selectedImages,
currentIndex: .constant(0),
onConfirm: {
print("[LOG] 预览确认,准备上传头像")
if let image = selectedImages.first, let data = image.jpegData(compressionQuality: 0.8) {
viewStore.send(AppSettingFeature.Action.avatarSelected(data))
}
showPreview = false
},
onCancel: {
print("[LOG] 预览取消")
showPreview = false
}
)
}
.onChange(of: selectedPhotoItems) { items in
print("[LOG] PhotosPicker选中items: \(items.count)")
guard !items.isEmpty else { return }
isLoading = true
selectedImages = []
@@ -86,16 +100,32 @@ struct AppSettingView: View {
item.loadTransferable(type: Data.self) { result in
defer { group.leave() }
if let data = try? result.get(), let uiImage = UIImage(data: data) {
tempImages.append(uiImage)
DispatchQueue.main.async {
tempImages.append(uiImage)
}
}
}
}
DispatchQueue.global().async {
group.wait()
DispatchQueue.main.async {
selectedImages = tempImages
isLoading = false
showPreview = !tempImages.isEmpty
if tempImages.isEmpty {
errorMessage = "图片加载失败,请重试"
//
showPreview = false
showCamera = false
showPhotoPicker = false
showActionSheet = false
print("[LOG] PhotosPicker图片加载失败弹出错误提示")
} else {
selectedImages = tempImages
print("[LOG] PhotosPicker获得图片准备延迟进入预览图片数量: \(tempImages.count)")
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
showPreview = true
print("[LOG] PhotosPicker延迟后进入预览")
}
}
}
}
}
@@ -103,7 +133,14 @@ struct AppSettingView: View {
get: { errorMessage != nil },
set: { if !$0 { errorMessage = nil } }
)) {
Alert(title: Text("错误"), message: Text(errorMessage ?? ""), dismissButton: .default(Text("确定")))
print("[LOG] 错误弹窗弹出: \(errorMessage ?? "")")
return Alert(title: Text("错误"), message: Text(errorMessage ?? ""), dismissButton: .default(Text("确定"), action: {
// actionset
showPreview = false
showCamera = false
showPhotoPicker = false
showActionSheet = false
}))
}
.navigationBarHidden(true)
.alert("修改昵称", isPresented: $showNicknameAlert) {

View File

@@ -114,7 +114,9 @@ private struct PhotosPickerModifier: ViewModifier {
item.loadTransferable(type: Data.self) { result in
defer { group.leave() }
if let data = try? result.get(), let uiImage = UIImage(data: data) {
tempImages.append(uiImage)
DispatchQueue.main.async {
tempImages.append(uiImage)
}
}
}
}

View File

@@ -53,4 +53,4 @@ public struct ImagePreviewView: View {
}
}
}
}
}