SwiftUI中Integer Picker使用问题及二维码显示选中整数需求
问题分析与解决方案
你的代码存在三个关键问题,导致无法正确生成对应数值的二维码:
- Picker绑定的是数组索引而非实际秒数值:当前
$sSecond绑定的是数组的索引(比如选"10"时sSecond是0),而非你需要的10、20这些实际数值 - Generate视图参数传递错误:你试图用
@State接收外部传递的值,这不符合SwiftUI的状态管理逻辑,应该直接接收常量值 - 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
相关产品推荐
相关产品推荐

