【问题标题】:SwiftUI / imagepicker / firebasefirestore - image uploads properly but does not show on the imageviewSwiftUI / imagepicker / firebasefirestore - 图像上传正确但未显示在 imageview
【发布时间】:2021-10-16 19:20:12
【问题描述】:

我正在开发这个项目,用户可以在其中进入设置视图并选择图像(使用 imagepicker)作为个人资料图像。然后将图像上传到 Firebasefirestore,并应在同一屏幕上以圆圈形式显示。图片选择器正常工作,所选图片已正确上传到 firebasefirestore,但所选图片未正确显示在圆圈中。你能帮帮我吗?

这是我的代码的相关部分。如有需要,很乐意分享 imagepicker 的代码。

import SwiftUI

struct SettingsView: View {
  @ObservedObject var settingsViewModel = SettingsViewModel()
  @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
  @State private var presented = false
  @State private var isShowPhotoLibrary = false
  @State private var image = UIImage()

var body: some View {
    NavigationView {
      VStack {
        
        Image(uiImage:self.image) // <-- here is where I want the image to appear
            .resizable()
            .aspectRatio(contentMode: .fill)
            .frame(width: 250.0, height: 250.0, alignment: .center)
            .clipShape(/*@START_MENU_TOKEN@*/Circle()/*@END_MENU_TOKEN@*/)
            .overlay(Circle().stroke(Color.white, lineWidth: 4))
            .shadow(radius: 10)
            .scaledToFit()

        Text("Project")
          .font(.title)
          .fontWeight(.semibold)
        
        Form {
          Section {
            HStack {
              Image(systemName: "checkmark.circle")
              Text("Upload profile image")
              Spacer()
              Text("Plain")
                .onTapGesture {
                    self.isShowPhotoLibrary = true
                }
                .sheet(isPresented: $isShowPhotoLibrary) {
                    ImagePicker(sourceType: .photoLibrary, selectedImage: self.$image)
                }
                
            }
          }
          
          AccountSection(settingsViewModel: self.settingsViewModel)
        }
        
        .navigationBarTitle("Settings", displayMode: .inline)
        .navigationBarItems(trailing:
          Button(action: { self.presentationMode.wrappedValue.dismiss() }) {
            Text("Done")
        })
        
      }
        
    }
 
  }
    
}

图像选择器:

import UIKit
import SwiftUI

struct ImagePicker: UIViewControllerRepresentable {
    
    var sourceType: UIImagePickerController.SourceType = .photoLibrary
    
    @Binding var selectedImage: UIImage
    @Environment(\.presentationMode) private var presentationMode

    func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
        
        let imagePicker = UIImagePickerController()
        imagePicker.allowsEditing = false
        imagePicker.sourceType = sourceType
        imagePicker.delegate = context.coordinator
        
        return imagePicker
    }
    
    func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
        
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    final class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
        
        var parent: ImagePicker
        
        init(_ parent: ImagePicker) {
            self.parent = parent
        }
        
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            
            if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
                
                uploadprofileImage(image: image)
                
            }
            
            parent.presentationMode.wrappedValue.dismiss()
        }
    }
}

【问题讨论】:

  • 你能显示ImagePicker的代码吗?
  • 刚刚添加...

标签: xcode google-cloud-firestore swiftui uiimagepickercontroller


【解决方案1】:

您从未设置过@Binding var selectedImage,因此SettingsView 中的图像不会更新。

if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
    parent.selectedImage = image /// add this line!
    uploadprofileImage(image: image)        
}

【讨论】:

  • 我收到一条错误消息,提示“'ImagePicker' 类型的实例成员 'selectedImage' 不能用于嵌套类型 'ImagePicker.Coordinator' 的实例”
  • @Joe 啊,我的错。更新了我的答案。
  • 美丽。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 2019-03-29
  • 2018-03-16
  • 2013-03-04
  • 2016-01-15
  • 2020-11-26
相关资源
最近更新 更多