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

SwiftUI中Integer Picker使用问题及二维码显示选中整数需求

问题分析与解决方案

你的代码存在三个关键问题,导致无法正确生成对应数值的二维码:

  1. Picker绑定的是数组索引而非实际秒数值:当前$sSecond绑定的是数组的索引(比如选"10"时sSecond是0),而非你需要的10、20这些实际数值
  2. Generate视图参数传递错误:你试图用@State接收外部传递的值,这不符合SwiftUI的状态管理逻辑,应该直接接收常量值
  3. Int转Data的方式错误:Data(second)不会把整数转换成对应的字符串数据,二维码生成需要的是文本的UTF-8编码数据

修正后的主视图代码

import SwiftUI

struct ContentView: View {
    @State private var selectedSecond = 10 // 初始值设为第一个选项
    @State var navigated = false
    let secondOptions = [10, 20, 30, 40, 50, 60] // 直接用Int数组更直观

    var body: some View {
        Form {
            Section {
                Picker(selection: $selectedSecond, label: Text("Select Seconds")) {
                    // 直接遍历Int数组,tag就是实际数值
                    ForEach(secondOptions, id: \.self) { second in
                        Text("\(second)").tag(second)
                    }
                }
            }
            NavigationLink(destination: Generate(second: selectedSecond), isActive: $navigated) {
                Text("Complete")
            }
        }
    }
}

修正后的Generate视图代码

import SwiftUI
import CoreImage.CIFilterBuiltins

struct Generate: View {
    let second: Int // 直接接收传递过来的数值,不需要@State
    let filter = CIFilter.qrCodeGenerator()
    let context = CIContext()

    var body: some View {
        Image(uiImage: generateQRCode(for: second))
            .interpolation(.none)
            .resizable()
            .frame(width: 150, height: 150)
    }

    func generateQRCode(for value: Int) -> UIImage {
        // 先把Int转成字符串,再转成UTF-8编码的Data
        guard let data = String(value).data(using: .utf8) else {
            return UIImage(systemName: "xmark") ?? UIImage()
        }
        filter.setValue(data, forKey: "inputMessage")
        
        guard let qrImage = filter.outputImage,
              let cgImage = context.createCGImage(qrImage, from: qrImage.extent) else {
            return UIImage(systemName: "xmark") ?? UIImage()
        }
        return UIImage(cgImage: cgImage)
    }
}

关键修改说明

  • 把选项数组改成Int类型,Picker直接绑定实际数值,避免索引和实际值混淆
  • Generate视图用let second: Int接收传递的数值,符合单向数据传递逻辑
  • 生成二维码时,先将整数转为字符串,再通过.utf8编码成Data,这是二维码生成器需要的正确数据格式
  • 优化了函数命名和变量命名,让代码更易读

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:40:35