基于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
相关产品推荐
相关产品推荐

