QR Code Generator仅显示单个值问题排查及代码修改咨询
二维码生成器多数据合并问题
我正在开发一个二维码生成器项目,期望客户输入信息后,二维码可包含多个值。当前生成器设置了多个信息输入字段,但测试时仅显示单个值,怀疑代码存在遗漏。我修改了数据合并的写法,想请教这样写是否正确?
原始代码
import Foundation import SwiftUI import CoreImage.CIFilterBuiltins struct GenerateQRCode: View { @State var first = "D3" @State var id = "abcafewrqr @Binding var time: Date" let filter = CIFilter.qrCodeGenerator() let cont = CIContext() var dateFormatter: DateFormatter { let df = DateFormatter() df.dateFormat = "HH:mm" return df } var body: some View { NavigationView{ Image(uiImage: GenerateTime(first: first, id: id, time: time)) .interpolation(.none) .resizable() .frame(width: 150, height: 150, alignment: .center) }.navigationBarBackButtonHidden(true) } func GenerateTime(first: String, id: String, time: Date)-> UIImage { let str = dateFormatter.string(from: time) let all = first + id + str let com = all.data(using: .utf8) filter.setValue(com, forKey: "inputMessage") if let qr = filter.outputImage { if let qrImage = cont.createCGImage(qr, from: qr.extent){ return UIImage(cgImage: qrImage) } } return UIImage(systemName: "xmark") ?? UIImage() } }
更新后的代码(数据合并部分)
func GenerateTime(first: String, id: String, time: Date)-> UIImage { let str = dateFormatter.string(from: time) let timeData = str.data(using: .utf8) let idData = id.data(using: .utf8) let firstData = first.data(using: .utf8) let com = firstData, idData, TimeData //<--Here Updated filter.setValue(com, forKey: "inputMessage") if let qr = filter.outputImage { if let qrImage = cont.createCGImage(qr, from: qr.extent){ return UIImage(cgImage: qrImage) } } return UIImage(systemName: "xmark") ?? UIImage() }
你的合并写法是错误的
let com = firstData, idData, TimeData 这行代码在Swift里是创建了一个元组,而不是合并多个Data对象。QR码生成器的inputMessage参数需要的是单个Data实例,元组类型完全不匹配,所以这样写不仅不会合并数据,还会导致编译错误(比如TimeData是未定义的变量名,应该是timeData)。
正确的多数据合并方式
要让二维码包含多个值,你需要把多个数据合并成一个Data对象,推荐两种方式:
1. 字符串拼接(推荐,解码时易拆分)
先把所有字段用明确的分隔符(比如换行符\n、竖线|、逗号,等)拼接成一个字符串,再转成Data。这样解码后可以通过分隔符拆分出原始字段值。
func GenerateTime(first: String, id: String, time: Date)-> UIImage { let str = dateFormatter.string(from: time) // 用换行符作为分隔符,方便解码时拆分 let combinedString = "\(first)\n\(id)\n\(str)" guard let com = combinedString.data(using: .utf8) else { return UIImage(systemName: "xmark") ?? UIImage() } filter.setValue(com, forKey: "inputMessage") if let qr = filter.outputImage, let qrImage = cont.createCGImage(qr, from: qr.extent) { return UIImage(cgImage: qrImage) } return UIImage(systemName: "xmark") ?? UIImage() }
2. 二进制数据直接拼接
如果不需要可读的字符串内容,可以直接把多个Data对象拼接在一起:
func GenerateTime(first: String, id: String, time: Date)-> UIImage { let str = dateFormatter.string(from: time) guard let firstData = first.data(using: .utf8), let idData = id.data(using: .utf8), let timeData = str.data(using: .utf8) else { return UIImage(systemName: "xmark") ?? UIImage() } var combinedData = Data() combinedData.append(firstData) combinedData.append(idData) combinedData.append(timeData) filter.setValue(combinedData, forKey: "inputMessage") if let qr = filter.outputImage, let qrImage = cont.createCGImage(qr, from: qr.extent) { return UIImage(cgImage: qrImage) } return UIImage(systemName: "xmark") ?? UIImage() }
额外注意:原始代码的语法错误
你原始代码里有两处明显的语法错误,需要先修正:
@State var id = "abcafewrqr字符串未闭合,应该改成@State var id = "abcafewrqr"@Binding var time: Date"多了一个双引号,应该改成@Binding var time: Date
内容的提问来源于stack exchange,提问作者user19613128
相关产品推荐
相关产品推荐

