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

基于Apple示例代码的电话号码识别App IB Outlet访问错误求助

问题分析与解决方案

核心问题根源

你看到PreviewView!显示灰色,确实是触发崩溃的直接原因:

  • Xcode中IBOutlet的类型显示灰色,说明IDE无法识别PreviewView这个自定义类——要么你没在项目里创建这个类,要么Storyboard中对应的视图没把Class指定为PreviewView。
  • 因为previewView是隐式解包的弱引用(weak var ...!),当它没正确关联到Storyboard的自定义视图时,实际值是nil,此时访问previewView.session就会触发EXC_BAD_ACCESS崩溃。

修复步骤

1. 创建PreviewView自定义类

Apple官方示例中的PreviewView是封装了相机预览层的自定义UIView,你需要手动添加这个类:

import UIKit
import AVFoundation

class PreviewView: UIView {
    var videoPreviewLayer: AVCaptureVideoPreviewLayer {
        guard let layer = layer as? AVCaptureVideoPreviewLayer else {
            fatalError("视图层类型错误,需要AVCaptureVideoPreviewLayer")
        }
        return layer
    }
    
    var session: AVCaptureSession? {
        get { videoPreviewLayer.session }
        set { videoPreviewLayer.session = newValue }
    }
    
    override class var layerClass: AnyClass {
        return AVCaptureVideoPreviewLayer.self
    }
}

2. 关联Storyboard视图

  • 打开Storyboard,找到你用作相机预览的那个View。
  • 在右侧「Identity Inspector」面板中,把「Class」设置为PreviewView(拼写必须和上面创建的类完全一致)。
  • 重新关联IBOutlet:删掉原来的previewView引用,从Storyboard的PreviewView拖线到ViewController中,确保类型是PreviewView。

3. 修复类名不匹配问题

你的代码存在类名不一致的错误:

  • 视图控制器类是myClass,但代理扩展写的是extension TextScanViewController,这会导致相机回调方法永远不会执行。
  • 统一类名:要么把myClass改成TextScanViewController,要么把扩展改成extension myClass。

额外注意事项

  • 新手建议尽量避免隐式解包(!),可以用可选绑定避免崩溃,比如:
if let validPreviewView = previewView {
    validPreviewView.session = captureSession
} else {
    print("previewView未正确关联到Storyboard")
}
  • 必须在Info.plist中添加相机权限描述(NSCameraUsageDescription),否则相机无法启动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:35:17