You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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必须明确遵循UIImagePickerControllerDelegateUINavigationControllerDelegate协议,否则设置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

火山引擎 最新活动