# ScannerView 扫描结果跳转 QRCodeDetailView 功能

## 概述

本次更新修改了 `ScannerView.swift`，使其在扫描到二维码或条形码结果时，能够自动跳转到 `QRCodeDetailView.swift` 详情页面，而不是仅仅发送通知。

## 主要功能

### 1. 自动跳转详情页
- 当用户选择扫描到的条码时，自动跳转到二维码详情页面
- 支持单个条码自动选择和多个条码手动选择
- 使用 `NavigationLink` 进行页面导航（非模态展示）

### 2. 自动保存历史记录
- 扫描到的条码自动保存到 Core Data 历史记录
- 数据来源标记为 "scanned"（扫描获得）
- 自动识别条码类型（二维码/条形码）

### 3. 智能类型识别
- 二维码：自动解析内容类型（Wi-Fi、URL、SMS、vCard等）
- 条形码：保存原始类型信息
- 使用 `QRCodeParser` 进行智能解析

### 4. 返回时自动重新扫描
- 从详情页返回时自动重新开始扫描
- 重置所有扫描状态
- 提供流畅的用户体验

## 技术实现

### 新增状态变量
```swift
@State private var navigateToDetail = false
@State private var selectedHistoryItem: HistoryItem?
```

### 修改扫描结果处理
```swift
private func handleCodeSelection(_ selectedCode: DetectedCode) {
    // 创建 HistoryItem 并保存到 Core Data
    let historyItem = createHistoryItem(from: selectedCode)
    
    // 设置选中的历史记录项并导航到详情页
    selectedHistoryItem = historyItem
    navigateToDetail = true
    
    // 发送通知（保持向后兼容）
    NotificationCenter.default.post(name: .scannerDidScanCode, object: formattedResult)
}
```

### 新增历史记录创建方法
```swift
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
    }
    
    // 保存到 Core Data
    CoreDataManager.shared.addHistoryItem(historyItem)
    
    return historyItem
}
```

### 使用 NavigationLink 进行导航
```swift
.background(
    NavigationLink(
        destination: Group {
            if let historyItem = selectedHistoryItem {
                QRCodeDetailView(historyItem: historyItem)
                    .onDisappear {
                        // 从详情页返回时，重新开始扫描
                        logInfo("🔄 从详情页返回，重新开始扫描", className: "ScannerView")
                        resetToScanning()
                    }
            }
        },
        isActive: $navigateToDetail
    ) {
        EmptyView()
    }
)
```

## 用户体验流程

1. **扫描阶段**：用户使用扫描器扫描二维码/条形码
2. **结果检测**：系统检测到条码，暂停预览
3. **选择确认**：
   - 单个条码：1秒后自动选择
   - 多个条码：用户手动点击选择点
4. **自动跳转**：选择后自动导航到详情页
5. **详情展示**：显示条码图片、类型、解析信息、操作按钮等
6. **返回扫描**：用户返回时自动重新开始扫描

## 导航方式对比

### 之前使用 Sheet（模态展示）
- 优点：简单实现，覆盖整个屏幕
- 缺点：模态展示，用户体验不够流畅

### 现在使用 NavigationLink（页面导航）
- 优点：原生导航体验，支持返回手势，更流畅
- 缺点：需要处理返回时的状态重置

## 返回时重新扫描机制

### 触发时机
- 用户点击返回按钮
- 用户使用返回手势
- 详情页面消失时

### 重置内容
```swift
.onDisappear {
    // 从详情页返回时，重新开始扫描
    logInfo("🔄 从详情页返回，重新开始扫描", className: "ScannerView")
    resetToScanning()
}
```

### 重置过程
1. 重置 UI 状态（`showPreviewPause = false`）
2. 重置扫描状态（`resetDetection()`）
3. 重新开始扫描（`restartScanning()`）
4. 延迟检查会话状态

## 向后兼容性

- 保留了原有的 `NotificationCenter` 通知机制
- 其他依赖扫描结果的组件仍然可以正常工作
- 不影响现有的扫描和检测逻辑

## 文件修改

- **主要文件**：`MyQrCode/ScannerView/ScannerView.swift`
- **新增导入**：`import CoreData`
- **状态变量**：`navigateToDetail`、`selectedHistoryItem`
- **新增方法**：`createHistoryItem(from:)`
- **导航方式**：从 `.sheet` 改为 `NavigationLink`
- **返回处理**：添加 `.onDisappear` 回调

## 依赖关系

- `CoreDataManager.shared`：用于保存历史记录
- `QRCodeParser`：用于解析二维码类型
- `HistoryItem`：Core Data 实体模型
- `QRCodeDetailView`：详情页面组件

## 测试建议

1. 测试单个二维码扫描的自动跳转
2. 测试多个二维码的用户选择跳转
3. 测试条形码扫描的跳转
4. 验证历史记录的正确保存
5. 检查详情页面的完整显示
6. **测试返回时的重新扫描功能**
7. **验证导航的流畅性**

## 注意事项

- 确保 Core Data 模型正确配置
- 验证 `QRCodeParser` 的可用性
- 测试不同设备方向的兼容性
- 检查内存使用情况（避免内存泄漏）
- **确保返回时扫描状态正确重置**
- **验证导航栈的正确管理**

## 更新日志

### v2.0 (最新)
- 将 sheet 展示改为 NavigationLink 导航
- 添加返回时自动重新扫描功能
- 优化用户体验和导航流畅性

### v1.0
- 实现扫描结果跳转详情页
- 自动保存历史记录
- 智能条码类型识别 