首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI中的ImagePicker

SwiftUI中的ImagePicker
EN

Stack Overflow用户
提问于 2019-12-07 22:47:19
回答 1查看 838关注 0票数 2

我正在尝试创建一个遵循this tutorial的SwiftUI图像拾取器。基本上,当用户点击屏幕上的灰色矩形时,就会出现一个图像拾取器。当他们选择一个图像时,它会被导入到灰色的矩形中。

问题是,当我运行代码时,我得到以下错误:Thread 1: Fatal error: Reading Environment<Binding<PresentationMode>> outside View.body

这出现在图像选取器结构中的行parent.presentationMode.wrappedValue.dismiss()上。

我的代码如下所示:

图像选取器

代码语言:javascript
复制
struct ImagePicker: UIViewControllerRepresentable {
    
  @Environment(\.presentationMode) var presentationMode
  @Binding var image: UIImage?
    
    class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
        let parent: ImagePicker

        init(_ parent: ImagePicker) {
            self.parent = parent
        }
        
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            if let uiImage = info[.originalImage] as? UIImage {
                parent.image = uiImage
            }

        parent.presentationMode.wrappedValue.dismiss()
        }     
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    

    func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
        let picker = UIImagePickerController()
        picker.delegate = context.coordinator
        return picker
    }

    func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
   
    }
}

内容视图

代码语言:javascript
复制
import SwiftUI

struct ContentView: View {
    
    @State private var image: Image?
    @State private var showingImagePicker = false
    @State private var inputImage: UIImage?
    

    var body: some View {
     NavigationView {
             ZStack {
                 Rectangle()
                     .fill(Color.secondary)

                 if image != nil {
                     image?
                         .resizable()
                         .scaledToFit()
                 } else {
                     Text("Tap to select a picture")
                 }
             }
             .onTapGesture {
                 self.showingImagePicker = true
             }


        .sheet(isPresented: $showingImagePicker, onDismiss: loadImage) {
            ImagePicker(image: self.$inputImage)
        }
     }
    }

    func loadImage() {
        guard let inputImage = inputImage else { return }
        image = Image(uiImage: inputImage)
    }
    
}

与推荐的here解决方案类似,我尝试在图像选取器结构中用@Binding var isPresented: Bool替换@Environment(\.presentationMode) var presentationMode,并用parent.isPresented = false替换麻烦的parent.presentationMode.wrappedValue.dismiss()行。

然而,这导致了一个不同的问题-当工作表被关闭时,图像没有加载(我猜是因为我没有在任何地方调用dismiss()方法)。

我对Swift和编程非常陌生,所以如果我可以在任何地方更简洁地解释并随时更正,我深表歉意。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-08 01:52:54

好的,看起来你是在用13.1 ->更新到13.2进行测试--就是这样

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59227158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档