@ -2,6 +2,7 @@ import SwiftUI
import AVFoundation
import AVFoundation
import AudioToolbox
import AudioToolbox
import Combine
import Combine
import CoreData
// MARK: - 主 扫 描 视 图
// MARK: - 主 扫 描 视 图
struct ScannerView : View {
struct ScannerView : View {
@ -10,6 +11,8 @@ struct ScannerView: View {
@ State private var selectedScanningStyle : ScanningLineStyle = . modern
@ State private var selectedScanningStyle : ScanningLineStyle = . modern
@ State private var screenOrientation = UIDevice . current . orientation
@ State private var screenOrientation = UIDevice . current . orientation
@ State private var previewLayer : AVCaptureVideoPreviewLayer ?
@ State private var previewLayer : AVCaptureVideoPreviewLayer ?
@ State private var navigateToDetail = false
@ State private var selectedHistoryItem : HistoryItem ?
var body : some View {
var body : some View {
ZStack {
ZStack {
@ -132,6 +135,23 @@ struct ScannerView: View {
. onReceive ( NotificationCenter . default . publisher ( for : UIDevice . orientationDidChangeNotification ) ) { _ in
. onReceive ( NotificationCenter . default . publisher ( for : UIDevice . orientationDidChangeNotification ) ) { _ in
handleOrientationChange ( )
handleOrientationChange ( )
}
}
. background (
NavigationLink (
destination : Group {
if let historyItem = selectedHistoryItem {
QRCodeDetailView ( historyItem : historyItem )
. onDisappear {
// 从 详 情 页 返 回 时 , 重 新 开 始 扫 描
logInfo ( " 🔄 从详情页返回,重新开始扫描 " , className : " ScannerView " )
resetToScanning ( )
}
}
} ,
isActive : $ navigateToDetail
) {
EmptyView ( )
}
)
}
}
// MARK: - 私 有 方 法
// MARK: - 私 有 方 法
@ -163,11 +183,45 @@ struct ScannerView: View {
logInfo ( " 选择的条码内容: \( selectedCode . content ) " , className : " ScannerView " )
logInfo ( " 选择的条码内容: \( selectedCode . content ) " , className : " ScannerView " )
logInfo ( " 选择的条码位置: \( selectedCode . bounds ) " , className : " ScannerView " )
logInfo ( " 选择的条码位置: \( selectedCode . bounds ) " , className : " ScannerView " )
// 创 建 H i s t o r y I t e m 并 保 存 到 C o r e D a t a
let historyItem = createHistoryItem ( from : selectedCode )
// 设 置 选 中 的 历 史 记 录 项 并 导 航 到 详 情 页
selectedHistoryItem = historyItem
navigateToDetail = true
// 发 送 通 知 ( 保 持 向 后 兼 容 )
let formattedResult = " 类型: \( selectedCode . type ) \n 内容: \( selectedCode . content ) "
let formattedResult = " 类型: \( selectedCode . type ) \n 内容: \( selectedCode . content ) "
logInfo ( " 格式化结果: \( formattedResult ) " , className : " ScannerView " )
logInfo ( " 格式化结果: \( formattedResult ) " , className : " ScannerView " )
NotificationCenter . default . post ( name : . scannerDidScanCode , object : formattedResult )
NotificationCenter . default . post ( name : . scannerDidScanCode , object : formattedResult )
// 使 用 导 航 返 回 , 不 需 要 手 动 d i s m i s s
}
private func createHistoryItem ( from detectedCode : DetectedCode ) -> HistoryItem {
let context = CoreDataManager . shared . container . viewContext
let historyItem = HistoryItem ( context : context )
historyItem . id = UUID ( )
historyItem . content = detectedCode . content
historyItem . dataType = DataType . qrcode . rawValue
historyItem . dataSource = DataSource . scanned . rawValue
historyItem . createdAt = Date ( )
historyItem . isFavorite = false
// 根 据 条 码 类 型 设 置 相 应 的 类 型 字 段
if detectedCode . type . lowercased ( ) . contains ( " qr " ) || detectedCode . type . lowercased ( ) . contains ( " 二维码 " ) {
// 尝 试 解 析 二 维 码 类 型
let parsedData = QRCodeParser . parseQRCode ( detectedCode . content )
historyItem . qrCodeType = parsedData . type . rawValue
} else {
// 条 形 码 类 型
historyItem . barcodeType = detectedCode . type
}
// 保 存 到 C o r e D a t a
CoreDataManager . shared . addHistoryItem ( historyItem )
logInfo ( " ✅ 已创建并保存历史记录项 " , className : " ScannerView " )
return historyItem
}
}
private func pauseForPreview ( ) {
private func pauseForPreview ( ) {