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

QR Code Generator仅显示单个值问题排查及代码修改咨询

二维码生成器多数据合并问题

我正在开发一个二维码生成器项目,期望客户输入信息后,二维码可包含多个值。当前生成器设置了多个信息输入字段,但测试时仅显示单个值,怀疑代码存在遗漏。我修改了数据合并的写法,想请教这样写是否正确?

原始代码

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()
    }
}

更新后的代码(数据合并部分)

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()
}

你的合并写法是错误的

let com = firstData, idData, TimeData 这行代码在Swift里是创建了一个元组,而不是合并多个Data对象。QR码生成器的inputMessage参数需要的是单个Data实例,元组类型完全不匹配,所以这样写不仅不会合并数据,还会导致编译错误(比如TimeData是未定义的变量名,应该是timeData)。

正确的多数据合并方式

要让二维码包含多个值,你需要把多个数据合并成一个Data对象,推荐两种方式:

1. 字符串拼接(推荐,解码时易拆分)

先把所有字段用明确的分隔符(比如换行符\n、竖线|、逗号,等)拼接成一个字符串,再转成Data。这样解码后可以通过分隔符拆分出原始字段值。

func GenerateTime(first: String, id: String, time: Date)-> UIImage {
    let str = dateFormatter.string(from: time)
    // 用换行符作为分隔符,方便解码时拆分
    let combinedString = "\(first)\n\(id)\n\(str)"
    guard let com = combinedString.data(using: .utf8) else {
        return UIImage(systemName: "xmark") ?? UIImage()
    }
    filter.setValue(com, forKey: "inputMessage")
    if let qr = filter.outputImage, let qrImage = cont.createCGImage(qr, from: qr.extent) {
        return UIImage(cgImage: qrImage)
    }
    return UIImage(systemName: "xmark") ?? UIImage()
}

2. 二进制数据直接拼接

如果不需要可读的字符串内容,可以直接把多个Data对象拼接在一起:

func GenerateTime(first: String, id: String, time: Date)-> UIImage {
    let str = dateFormatter.string(from: time)
    guard let firstData = first.data(using: .utf8),
          let idData = id.data(using: .utf8),
          let timeData = str.data(using: .utf8) else {
        return UIImage(systemName: "xmark") ?? UIImage()
    }
    var combinedData = Data()
    combinedData.append(firstData)
    combinedData.append(idData)
    combinedData.append(timeData)
    
    filter.setValue(combinedData, forKey: "inputMessage")
    if let qr = filter.outputImage, let qrImage = cont.createCGImage(qr, from: qr.extent) {
        return UIImage(cgImage: qrImage)
    }
    return UIImage(systemName: "xmark") ?? UIImage()
}

额外注意:原始代码的语法错误

你原始代码里有两处明显的语法错误,需要先修正:

  • @State var id = "abcafewrqr 字符串未闭合,应该改成 @State var id = "abcafewrqr"
  • @Binding var time: Date" 多了一个双引号,应该改成 @Binding var time: Date

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:40:36