You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI二维码生成器中如何使用Picker选中的Int值生成二维码

解决SwiftUI中二维码生成函数适配Int类型参数的问题

要让二维码生成函数适配Int类型参数,核心思路是先把Int转换成String,再将String转为QR码生成所需的Data。同时你的代码里还有几处语法和逻辑错误,一起修正如下:

1. 修正后的QRCode视图

import Foundation
import SwiftUI
import CoreImage.CIFilterBuiltins

struct QRCode: View {
    @State private var selectedAge = 10 // 初始值改为数组内存在的元素,避免Picker初始显示异常
    let ages = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] // 变量名改为复数更合理
    @State var navigated = false

    var body: some View {
        NavigationStack { // iOS 16+推荐用NavigationStack替代NavigationView
            VStack {
                Picker("Select Age", selection: $selectedAge) {
                    ForEach(ages, id: \.self) { age in
                        Text("\(age)")
                    }
                }
                .pickerStyle(.wheel) // 可选:给Picker添加样式,交互更直观

                // 添加导航按钮,跳转到二维码生成视图
                NavigationLink("生成二维码", destination: Generate(age: $selectedAge))
            }
            .padding()
        }
    }
}

2. 修正后的Generate视图

import Foundation
import SwiftUI
import CoreImage.CIFilterBuiltins

struct Generate: View {
    @Binding var age: Int // 变量名改为小写开头,符合Swift命名规范

    private let qrFilter = CIFilter.qrCodeGenerator()
    private let context = CIContext()

    var body: some View {
        VStack {
            Image(uiImage: generateQRCode(from: age))
                .interpolation(.none)
                .resizable()
                .scaledToFit()
                .frame(width: 150, height: 150)
        }
        .navigationTitle("二维码")
    }

    // 适配Int参数的二维码生成函数
    func generateQRCode(from number: Int) -> UIImage {
        // 1. 将Int转为String
        let stringValue = String(number)
        // 2. 将String转为UTF-8编码的Data
        guard let data = stringValue.data(using: .utf8) else {
            return UIImage(systemName: "xmark") ?? UIImage()
        }

        // 3. 设置QR码生成器的输入数据
        qrFilter.setValue(data, forKey: "inputMessage")
        
        // 4. 生成并返回二维码图片
        guard let qrImage = qrFilter.outputImage,
              let cgImage = context.createCGImage(qrImage, from: qrImage.extent) else {
            return UIImage(systemName: "xmark") ?? UIImage()
        }
        return UIImage(cgImage: cgImage)
    }
}

关键说明

  • Int转String再转Data:QR码生成器qrCodeGenerator要求输入UTF-8编码的Data,所以先把Int转成字符串,再通过data(using: .utf8)得到符合要求的Data。
  • 代码修正点:
    • 替换所有中文引号为英文引号,避免语法错误
    • 修正uft8拼写错误为utf8
    • 优化变量命名,符合Swift编码规范
    • 修复Generate视图中调用生成函数的参数错误
    • 用NavigationStack替代旧的NavigationView(iOS 16+适用,兼容旧版本可改回)
    • 补充跳转按钮,完善完整流程

内容的提问来源于stack exchange,提问作者user20776389

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:20:38