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从未初始化过