Ios SwiftUI-如何处理相机权限?

Ios SwiftUI-如何处理相机权限?,ios,swift,swiftui,Ios,Swift,Swiftui,我的图像选择器工作正常。然而,我试图实现相机权限处理,我似乎被卡住了。我收到错误:“函数预期返回UIImagePickerController中缺少返回”,这是正确的。我不确定我还能把switch语句放在哪里进行处理。感谢您的帮助 struct ImagePicker: UIViewControllerRepresentable { var sourceType: UIImagePickerController.SourceType = .photoLibrary

我的图像选择器工作正常。然而,我试图实现相机权限处理,我似乎被卡住了。我收到错误:“函数预期返回UIImagePickerController中缺少返回”,这是正确的。我不确定我还能把switch语句放在哪里进行处理。感谢您的帮助

struct ImagePicker: UIViewControllerRepresentable {
    
    var sourceType: UIImagePickerController.SourceType = .photoLibrary
    
    @Binding var selectedImage: UIImage
    @Binding var alertCameraAccessNeeded: Bool
    @Environment(\.presentationMode) private var presentationMode
    @EnvironmentObject private var userManager: UserManager
    
    let cameraAuthStatus = AVCaptureDevice.authorizationStatus(for: .video)
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
        
        switch cameraAuthStatus {
        case .notDetermined: requestCameraPermission()
        case .authorized:
            
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = context.coordinator
            imagePicker.allowsEditing = true
            imagePicker.sourceType = sourceType
            
            return imagePicker
            
        case .restricted, .denied: self.alertCameraAccessNeeded = true
            
        @unknown default:
            fatalError()
        }
        
        
    }
    
    func requestCameraPermission() {
        AVCaptureDevice.requestAccess(for: .video, completionHandler: {accessGranted in
            guard accessGranted == true else { return }
            
        })
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self, userManager: userManager)
    }
    
    
    func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
        
    }
    
    
    class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
        
        let parent: ImagePicker
        let userManager: UserManager
        
        
        init(_ parent: ImagePicker, userManager: UserManager) {
            self.parent = parent
            self.userManager = userManager
        }
        
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            
            if let image = info[.editedImage] as? UIImage {
                parent.selectedImage = image
                userManager.uploadProfilePicture(image: image)
            }
            
            
            parent.presentationMode.wrappedValue.dismiss()
        }
    }
}
struct ImagePicker:UIViewControllerRepresentable{
变量sourceType:UIImagePickerController.sourceType=.photoLibrary
@绑定变量SelecteImage:UIImage
@绑定变量AlertCameraAccessRequired:Bool
@环境(\.presentationMode)私有变量presentationMode
@EnvironmentObject私有变量userManager:userManager
让cameraAuthStatus=AVCaptureDevice.authorizationStatus(用于:。视频)
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->UIImagePickerController{
切换cameraAuthStatus{
case.notDetermined:requestCameraPermission()
案例.授权:
让imagePicker=UIImagePickerController()
imagePicker.delegate=context.coordinator
imagePicker.allowsEditing=true
imagePicker.sourceType=源类型
返回图像选择器
case.restricted、.denied:self.alertCameraAccessRequired=true
@未知默认值:
法塔莱罗()
}
}
func requestCameraPermission(){
AVCaptureDevice.requestAccess(对于:。视频,completionHandler:{AccessPermited in
guard AccessGrassed==true else{return}
})
}
func makeCoordinator()->Coordinator{
协调员(self,userManager:userManager)
}
func updateUIViewController(uViewController:UIImagePickerController,上下文:UIViewControllerRepresentableContext){
}
类协调器:NSObject、UIImagePickerControllerDelegate、UINavigationControllerDelegate{
让父对象:ImagePicker
让userManager:userManager
init(uuParent:ImagePicker,userManager:userManager){
self.parent=parent
self.userManager=userManager
}
func imagePickerController(picker:UIImagePickerController,didFinishPickingMediaWithInfo:[UIImagePickerController.InfoKey:Any]){
如果让image=info[.editeImage]作为UIImage{
parent.selectedImage=image
userManager.uploadProfilePicture(图像:图像)
}
parent.presentationMode.wrappedValue.disclease()
}
}
}

作为对您的评论的回应,您希望知道如何请求权限并仅有条件地显示图像选择器,下面是一个简单的示例,允许您强制执行操作(例如,设置@State变量)或有条件地显示视图(如果您有权限)

在附件中请求权限,但也可以移动到按钮按下或类似操作

class CameraManager : ObservableObject {
    @Published var permissionGranted = false
    
    func requestPermission() {
        AVCaptureDevice.requestAccess(for: .video, completionHandler: {accessGranted in
            DispatchQueue.main.async {
                self.permissionGranted = accessGranted
            }
        })
    }
}

struct ContentView: View {
    @StateObject var cameraManager = CameraManager()
    
    var body: some View {
        VStack {
            Text("Hello, world")
            if cameraManager.permissionGranted {
                //show a conditional view only if you have permission
            }
        }
        .onReceive(cameraManager.$permissionGranted, perform: { (granted) in
            if granted {
                //show image picker controller
            }
        })
        .onAppear {
            cameraManager.requestPermission()
        }
    }
}

您的
makeUIViewController
的返回类型为
UIImagePickerController
,但您实际上只在某些情况下返回该类型。我的建议是,在您需要在其他组件中返回此内容之前,先请求camera权限。@jnpdx所以在某种嵌套函数中?我不确定为什么必须这样做nested@jnpdx你知道我该如何实施吗?我似乎找不到解决办法