Search code examples
swiftuiintegerqr-code

How to use picker as Int in qr code generator with swiftui


I am new to swift and i am using swiftui to create a qr code generator. I want to use a picker to select number and it shows in the qr code, when i finished the picker and i was trying to add function as qr code generator and the integer needs to be convert to string, so it can be used in the function. How can i make the function work with Integer?

Here is my code which i tried:

I used age as Integer with picker

import Foundation
import SwiftUI
import CoreImage.CIFilterBuiltins

struct QRCode: View {
    @State private var selectedAge = 1
    let age = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
    @State var navigated = false

    var body: some View {
        NavigationView{
            VStack{
                Picker(“Select Age”, selection: $selectedAge) {
                    ForEach(age,id:\.self) {
                        ages in Text(“\(ages)”)                 }
                }
            }
        }
    }
}


//Below is the other view with the function

import Foundation
import SwiftUI
import CoreImage.CIFilterBuiltins

struct Generate: View {
    @Binding var Ages: Int

    let filter = CIFilter.qrCodeGenerator()
    let cont = CIContext()

    var body: some View {
        NavigationView{
            Image(uiImage: GenerateQRCode(old: old))
                .interpolation(.none)
                .resizable()
                .frame(width: 150, height: 150, alignment: .center)
        }
    }

    func GenerateQRCode(old: Int)-> UIImage {
        let com = Ages
        let con = com.data(using: .uft8)

        filter.setValue(con, 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()
    }

}


Solution

  • Try this simple approach to "...make the function work with Integer". Note the name change ages/age for clarity.

    struct ContentView: View {
        var body: some View {
            QRCode()
        }
    }
    
    struct QRCode: View {
        @State private var selectedAge = 1
        let ages = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]  // <-- ages
        @State var navigated = false
        
        var body: some View {
            NavigationView {
                VStack {
                    Picker("Select Age", selection: $selectedAge) {
                        ForEach(ages, id: \.self) { age in
                            Text("\(age)")
                        }
                    }.pickerStyle(.wheel) // <-- for testing
                    Generate(age: $selectedAge)
                }
            }
        }
    }
    
    struct Generate: View {
        @Binding var age: Int
        
        let filter = CIFilter.qrCodeGenerator()
        let cont = CIContext()
        
        var body: some View {
            Image(uiImage: GenerateQRCode(old: age))
                .interpolation(.none)
                .resizable()
                .frame(width: 150, height: 150, alignment: .center)
        }
        
        func GenerateQRCode(old: Int)-> UIImage {
            let data = String(old).data(using: .utf8)    // <-- here
            filter.setValue(data, forKey: "inputMessage") // <-- here
            if let qr = filter.outputImage {
                if let qrImage = cont.createCGImage(qr, from: qr.extent) {
                    return UIImage(cgImage: qrImage)
                }
            }
            return UIImage(systemName: "xmark") ?? UIImage()
        }
        
    }