You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MyQRCode/docs/SCANNER_TO_QRCODE_DETAIL_RE...

196 lines
6.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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
- 实现扫描结果跳转详情页
- 自动保存历史记录
- 智能条码类型识别