@ -38,6 +38,8 @@ enum TabType: String, CaseIterable {
struct QRCodeStyleView : View {
let qrCodeContent : String
let qrCodeType : QRCodeType
let existingStyleData : QRCodeStyleData ? // 可 选 的 现 有 样 式 数 据
let historyItem : HistoryItem ? // 可 选 的 现 有 历 史 记 录 项
@ Environment ( \ . dismiss ) private var dismiss
@ EnvironmentObject var coreDataManager : CoreDataManager
@ -128,6 +130,7 @@ struct QRCodeStyleView: View {
}
. onAppear {
checkPhotoLibraryPermission ( )
initializeExistingStyle ( )
}
. sheet ( isPresented : $ showingImagePicker ) {
ImagePicker (
@ -539,6 +542,34 @@ struct QRCodeStyleView: View {
// MARK: - 初 始 化 现 有 样 式
private func initializeExistingStyle ( ) {
guard let existingStyle = existingStyleData else { return }
// 设 置 现 有 样 式
if let foregroundColor = QRCodeColor ( rawValue : existingStyle . foregroundColor ) {
selectedForegroundColor = foregroundColor
}
if let backgroundColor = QRCodeColor ( rawValue : existingStyle . backgroundColor ) {
selectedBackgroundColor = backgroundColor
}
if let dotType = QRCodeDotType ( rawValue : existingStyle . dotType ) {
selectedDotType = dotType
}
if let eyeType = QRCodeEyeType ( rawValue : existingStyle . eyeType ) {
selectedEyeType = eyeType
}
// 设 置 L o g o
if existingStyle . hasCustomLogo {
// 加 载 自 定 义 L o g o
customLogoImage = existingStyle . customLogoImage
} else if let logoString = existingStyle . logo ,
let logo = QRCodeLogo ( rawValue : logoString ) {
selectedLogo = logo
}
}
// MARK: - 保 存 二 维 码
private func saveQRCode ( ) {
// 生 成 二 维 码 图 片
@ -548,7 +579,11 @@ struct QRCodeStyleView: View {
UIImageWriteToSavedPhotosAlbum ( qrCodeImage , nil , nil , nil )
// 保 存 到 历 史 记 录
saveToHistory ( )
if historyItem != nil {
updateExistingHistory ( )
} else {
saveToHistory ( )
}
dismiss ( )
}
@ -654,6 +689,80 @@ struct QRCodeStyleView: View {
}
}
// MARK: - 更 新 现 有 历 史 记 录
private func updateExistingHistory ( ) {
guard let existingHistoryItem = historyItem else { return }
// 确 保 在 主 线 程 上 执 行 C o r e D a t a 操 作
DispatchQueue . main . async {
do {
let context = self . coreDataManager . container . viewContext
// 保 存 二 维 码 样 式 数 据
var logoIdentifier : String ? = nil
var hasCustomLogo = false
var customLogoFileName : String ? = nil
if let customLogo = self . customLogoImage {
// 自 定 义 L o g o : 保 存 到 文 件 系 统
let fileName = " custom_ \( UUID ( ) . uuidString ) .png "
logoIdentifier = " custom_ \( UUID ( ) . uuidString ) "
hasCustomLogo = true
customLogoFileName = fileName
// 保 存 图 片 到 文 件 系 统
self . saveCustomLogoToFile ( customLogo , fileName : fileName )
print ( " 🖼️ 自定义Logo已保存到文件: \( fileName ) " )
} else if let selectedLogo = self . selectedLogo {
// 预 设 L o g o
logoIdentifier = selectedLogo . rawValue
hasCustomLogo = false
print ( " 🏷️ 使用预设Logo: \( selectedLogo . rawValue ) " )
}
let styleData = QRCodeStyleData (
foregroundColor : self . selectedForegroundColor . rawValue ,
backgroundColor : self . selectedBackgroundColor . rawValue ,
dotType : self . selectedDotType . rawValue ,
eyeType : self . selectedEyeType . rawValue ,
logo : logoIdentifier ,
hasCustomLogo : hasCustomLogo ,
customLogoFileName : customLogoFileName
)
print ( " 🎨 样式数据更新成功: \( styleData . styleDescription ) " )
// 将 样 式 数 据 转 换 为 J S O N 字 符 串
do {
let jsonData = try JSONEncoder ( ) . encode ( styleData )
let jsonString = String ( data : jsonData , encoding : . utf8 ) ? ? " "
existingHistoryItem . qrCodeStyleData = jsonString
print ( " ✅ 样式数据已更新到历史记录项 " )
} catch {
print ( " ❌ 样式数据JSON编码失败: \( error ) " )
}
// 保 存 到 C o r e D a t a
try context . save ( )
print ( " ✅ 二维码样式更新成功 " )
// 强 制 刷 新 历 史 记 录
self . coreDataManager . objectWillChange . send ( )
} catch {
print ( " ❌ Core Data更新失败: \( error . localizedDescription ) " )
print ( " ❌ 错误详情: \( error ) " )
// 如 果 是 N S E r r o r , 打 印 更 多 信 息
if let nsError = error as NSError ? {
print ( " ❌ 错误域: \( nsError . domain ) " )
print ( " ❌ 错误代码: \( nsError . code ) " )
print ( " ❌ 用户信息: \( nsError . userInfo ) " )
}
}
}
}
// MARK: - 权 限 检 查
private func checkPhotoLibraryPermission ( ) {
let status = PHPhotoLibrary . authorizationStatus ( )
@ -948,6 +1057,6 @@ struct ImagePicker: UIViewControllerRepresentable {
// MARK: - 预 览
# Preview {
QRCodeStyleView ( qrCodeContent : " https://www.example.com " , qrCodeType : . url )
QRCodeStyleView ( qrCodeContent : " https://www.example.com " , qrCodeType : . url , existingStyleData : nil , historyItem : nil )
. environmentObject ( CoreDataManager . shared )
}