Search code examples
xcodeswiftuiqr-code

Why my QR Code Generator only show one value


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?


Solution

  • 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.