Swift相机功能实现求助:点击相机按钮应用崩溃
嘿,你的相机按钮点击崩溃问题我遇到过好几次了,大概率是这几个常见的iOS相机调用坑导致的,我帮你逐一拆解并给出修复方案:
可能的崩溃原因及对应解决方法
1. 缺少相机权限配置(最常见的崩溃原因)
iOS 10及以上版本,调用相机必须在Info.plist中添加权限描述,否则App会直接崩溃,而且App Store审核也会被拒。你需要这么操作:
- 打开项目的
Info.plist,右键选择Add Row - 添加
NSCameraUsageDescription,值填你需要相机的原因(比如“需要访问相机拍摄照片用于头像设置”) - 如果之后需要把照片保存到相册,还要额外添加
NSPhotoLibraryAddUsageDescription,同样填写对应的描述
2. 代理方法签名完全错误
你写的imagePickerController方法签名不符合Swift的规范,系统无法正确回调这个方法,甚至会引发运行时异常。正确的代理方法应该是这样的:
// 选中照片后的回调 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { // 获取拍摄的原图 if let originalImage = info[.originalImage] as? UIImage { camera.image = originalImage } // 一定要记得关闭图片选择器 picker.dismiss(animated: true, completion: nil) } // 实现取消按钮的回调,避免用户取消时出现界面卡住的情况 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) }
另外你原来的代码里UIImagePickerControllerOrigina...是拼写不完整,Swift 3+的正确写法是UIImagePickerController.InfoKey.originalImage。
3. 没有遵循必要的协议
你的ViewController必须明确遵循UIImagePickerControllerDelegate和UINavigationControllerDelegate协议,否则设置picker.delegate = self会报错或者崩溃。修改你的类声明:
class YourViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { // 你的其他代码(比如相机按钮的IBAction,UIImageView的IBOutlet等) }
4. 在不支持相机的设备上调用(比如模拟器)
iOS模拟器没有真实的相机硬件,如果直接调用.camera源类型会崩溃。你需要先判断设备是否支持相机:
@IBAction func ACPressed(_ sender: Any) { let picker = UIImagePickerController() picker.delegate = self // 先检查设备是否支持相机 if UIImagePickerController.isSourceTypeAvailable(.camera) { picker.sourceType = .camera present(picker, animated: true, completion: nil) } else { // 提示用户设备不支持相机,或者切换到相册选择图片 let alert = UIAlertController(title: "提示", message: "当前设备不支持相机功能", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) } }
最后附上完整的修复后代码示例
import UIKit class YourViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { // 假设你有一个UIImageView用于显示拍摄的照片 @IBOutlet weak var cameraImageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } @IBAction func ACPressed(_ sender: Any) { let picker = UIImagePickerController() picker.delegate = self if UIImagePickerController.isSourceTypeAvailable(.camera) { picker.sourceType = .camera present(picker, animated: true, completion: nil) } else { let alert = UIAlertController(title: "提示", message: "当前设备不支持相机", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) } } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let originalImage = info[.originalImage] as? UIImage { cameraImageView.image = originalImage } picker.dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) } }
内容的提问来源于stack exchange,提问作者GamerPlayClips




