I have a project need to create qr code generator and i want to show more than one value when customer insert their information. My Qr Code generator have some information field to let customer insert their infomation, but i added these field and test out, it only show one value, and i don' know why other values didn't show, maybe i just missed some part in the code, i don't know where is the problem, any expert knows what happened?
Example of the Code:
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()
}
}
Update:
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()
}
CombineString like above what i did, is it right?
Do you mean you get only one date from the 3 dates you've set in the QR code generator when scanning the resulting QR code?
If yes, then here is your problem:
filter.setValue(firstData, forKey: "inputMessage")
filter.setValue(idData, forKey: "inputMessage")
filter.setValue(timeData, forKey: "inputMessage")
You are suppose to set inputMessage
once. Each subsequent setValue
call will overwrite the previous.
You should format the 3 dates into one String
and set inputMessage
only once.