You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中App进入前台时两种相机场景的条件判断问题

解决方案

针对HSAttachmentPicker打开相机后无法控制isCameraMode状态的问题,我们可以通过利用第三方库的代理回调和调整状态重置时机来解决,具体步骤如下:


1. 修正isCameraMode的重置逻辑

原代码中在viewDidAppear里直接重置isCameraMode = false会导致相机操作返回后状态被提前清空,需要把重置逻辑移到各个选择器的完成/取消回调中:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
  
    if !isCameraMode {
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(applicationWillEnterForeground(_:)),
            name: UIApplication.willEnterForegroundNotification,
            object: nil)
    }
    // 移除这行:isCameraMode = false
}

2. 补全UIImagePickerController的代理回调

确保头像相机操作完成后正确重置状态:

// 扩展实现UIImagePickerController代理
extension YourViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        // 处理选中的头像逻辑
        picker.dismiss(animated: true) {
            self.isCameraMode = false
        }
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true) {
            self.isCameraMode = false
        }
    }
}

3. 实现HSAttachmentPicker的代理回调

通过第三方库的代理方法捕获相机选择事件,并在操作完成后重置状态:

// 扩展实现HSAttachmentPicker代理
extension YourViewController: HSAttachmentPickerDelegate {
    // 捕获用户选择的来源(相机/相册/文件等)
    func attachmentPicker(_ picker: HSAttachmentPicker, didSelectSource source: HSAttachmentSource) {
        // 判断是否选择了相机,设置状态标记
        if source == .camera {
            self.isCameraMode = true
        }
    }
    
    // 附件选择完成后重置状态
    func attachmentPicker(_ picker: HSAttachmentPicker, didSelect attachments: [HSAttachment]) {
        // 处理选中的附件逻辑
        self.isCameraMode = false
    }
    
    // 取消选择后重置状态
    func attachmentPickerDidCancel(_ picker: HSAttachmentPicker) {
        self.isCameraMode = false
    }
}

注:如果HSAttachmentPicker没有didSelectSource方法,可查看其官方文档确认对应来源选择的回调方法,核心是在用户选择相机时将isCameraMode设为true。


4. 验证逻辑

  • 点击头像按钮选择相机:打开相机时isCameraMode = true,返回后在代理回调中重置为false,applicationWillEnterForeground不会执行目标代码。
  • 点击文件上传按钮选择相机:通过HSAttachmentPicker的代理捕获相机选择事件,设置isCameraMode = true,操作完成后重置,避免触发不必要的服务请求。
  • 选择相册/文件时:isCameraMode不会被设置为true,返回后正常执行原有逻辑。

内容的提问来源于stack exchange,提问作者new dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:37:31