Swiftui 我不确定为什么我的imagePickerController协调器没有触发didFinishPickingMediaWithInfo

Swiftui 我不确定为什么我的imagePickerController协调器没有触发didFinishPickingMediaWithInfo,swiftui,uiimagepickercontroller,Swiftui,Uiimagepickercontroller,我希望这不是一个重复,但如果它是有人可以告诉我在正确的方向。我尝试了该方法的不同变体,但我的断点都没有阻止流 皮克维 struct PickerView: UIViewControllerRepresentable { @Binding var savedImage: Bool @Binding var savedVideo: Bool @Binding var video: AVAsset? @Binding var image: UIImage? @Environment(\.presen

我希望这不是一个重复,但如果它是有人可以告诉我在正确的方向。我尝试了该方法的不同变体,但我的断点都没有阻止流

皮克维

struct PickerView: UIViewControllerRepresentable {

@Binding var savedImage: Bool
@Binding var savedVideo: Bool
@Binding var video: AVAsset?
@Binding var image: UIImage?
@Environment(\.presentationMode) var isPresented
var sourceType: UIImagePickerController.SourceType?
    
func makeUIViewController(context: Context) -> UIImagePickerController {
    let imagePicker = UIImagePickerController()
    if let type = self.sourceType {
        imagePicker.sourceType = type
        imagePicker.delegate = context.coordinator // confirming the delegate
        imagePicker.mediaTypes = ["public.image", "public.movie"]
    }
    return imagePicker
}

func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {

}

// Connecting the Coordinator class with this struct
func makeCoordinator() -> Coordinator {
    return Coordinator(picker: self)
}
}
协调人

class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
var picker: PickerView

init(picker: PickerView) {
    self.picker = picker
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let media = info[UIImagePickerController.InfoKey.mediaURL] as? NSURL {
        self.picker.video = AVAsset(url: media.absoluteURL!)
        self.picker.savedVideo = true
    } else if let original = info[.originalImage] as? UIImage {
        self.picker.image = original
        self.picker.savedImage = true
    } else if let metadata = info[UIImagePickerController.InfoKey.mediaMetadata] as? NSDictionary {
        print(metadata)
    }
    self.picker.isPresented.wrappedValue.dismiss()
}

}
我将断点放在上面的最后一个方法中,没有触发任何内容。不知道为什么

下面是我如何实现ImagePickerView来展示自己的

@State private var sourceType: UIImagePickerController.SourceType?
@State private var savedImage: Bool = false
@State private var savedVideo: Bool = false
@State private var isImagePickerDisplay = false
@State var video: AVAsset?
@State var image: UIImage?
var body: some View {
    VStack(spacing: 0) {
        HStack(spacing: 0){
            Spacer()
            Button(action: {
                //Opens up camera app
                self.sourceType = .camera
                self.isImagePickerDisplay.toggle()
            }, label: {
                Image(systemName: "camera")
                    .resizable()
                    .frame(width: 25, height: 25)
                    .foregroundColor(Color("Color2"))
                }).frame(width: 50, height: 50, alignment: .leading)
            Button(action: {
                //Opens up photo library
                self.sourceType = .photoLibrary
                self.isImagePickerDisplay.toggle()
            }, label: {
                Image(systemName: "photo.on.rectangle")
                    .resizable()
                    .frame(width: 25, height: 25)
                    .foregroundColor(Color("Color2"))
            }).frame(width: 50, height: 50, alignment: .leading)
        }
        ZStack{
            if let image = image {
                Image(uiImage: image)
                    .resizable()
                    .scaledToFit()
                    .frame(width: width, height: width, alignment: .center)
            } else if video != nil {
                UploadPlayerView(upload: uploadViewModel,
                                 frame: CGRect(x: 0, y: 0, width: width*3, height: (width*3)*9/16))
            } else {
                //grid().gridStyle(StaggeredGridStyle(.vertical, tracks: 3, spacing: 0))
            }
        }
        .frame(width: width, height: width)
    }
    .sheet(isPresented: $isImagePickerDisplay, content: {
        PickerView(savedImage: $savedImage, savedVideo: $savedVideo, video: $video, image: $image, sourceType: self.sourceType)
    })
}

我想看到我的ZStack根据用户的选择将视图更改为图像或视频。我没有在视频或图像变量中得到任何更改,这使我相信协调器没有按预期工作

您需要无条件地分配委派,但仅当
sourceType
不为零时才分配委派

这是固定部分

func makeUIViewController(context: Context) -> UIImagePickerController {
    let imagePicker = UIImagePickerController()
    if let type = self.sourceType {
        imagePicker.sourceType = type

         // probably this line also should be moved out of condition
        imagePicker.mediaTypes = ["public.image", "public.movie"]   // << ??
    }

    imagePicker.delegate = context.coordinator // << this one !!
    
    return imagePicker
}
func makeUIViewController(上下文:context)->UIImagePickerController{
让imagePicker=UIImagePickerController()
如果let type=self.sourceType{
imagePicker.sourceType=类型
//也许这条线也应该被移走

imagePicker.mediaTypes=[“public.image”,“public.movie”]//感谢您的快速响应。我还注意到我忘了将@Binding放在sourceType变量前面。sourceType从未初始化过