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

SwiftUI中如何为二维码生成函数添加多个参数?

解决Swift二维码生成器添加整数参数的错误

你只修改了imageGenerate函数的参数定义,但遗漏了参数传递路径的更新、调用处传参以及UI层的变量绑定,以下是完整的修正步骤和代码:

核心修改点

  • 在根视图添加整数状态变量,用于存储或传递整数参数
  • 给GenerateQRCode视图添加对应的绑定变量,接收整数参数
  • 更新imageGenerate函数的调用,传入新的整数参数
  • 将整数参数整合到二维码的内容中(你之前添加了参数但未实际使用)

完整修正后的代码

import Foundation
import SwiftUI
import CoreImage.CIFilterBuiltins

struct ContentView: View {
    @State var start = Date()
    // 添加整数状态变量,示例为时长(可根据需求调整用途)
    @State var duration = 30
    
    var body: some View {
        VStack(spacing: 20) {
            DatePicker("", selection: $start, displayedComponents: [.hourAndMinute])
                .datePickerStyle(.wheel)
            
            // 添加整数输入UI,让用户设置参数
            HStack {
                Text("时长(分钟):")
                TextField("输入数字", value: $duration, format: .number)
                    .textFieldStyle(.roundedBorder)
                    .frame(width: 100)
                    .keyboardType(.numberPad)
            }
            
            // 传递新的绑定参数给GenerateQRCode
            GenerateQRCode(start: $start, time: $duration)
        }
        .padding()
    }
}

struct GenerateQRCode: View {
    @Binding var start: Date
    // 添加整数参数的绑定
    @Binding var time: Int
        
    let filter = CIFilter.qrCodeGenerator()
    let cont = CIContext()
    
    var dateFormatter: DateFormatter {
        let df = DateFormatter()
        df.dateFormat = "HH:mm"
        return df
    }
    
    var body: some View {
        NavigationView{
            // 更新函数调用,传入time参数
            Image(uiImage: imageGenerate(start: start, time: time))
                .interpolation(.none)
                .resizable()
                .frame(width: 150, height: 150, alignment: .center)
        }
        .navigationBarBackButtonHidden(true)
    }
    
    // 整合整数参数到二维码内容中
    func imageGenerate(start: Date, time: Int)-> UIImage {
        // 将时间和整数拼接成二维码文本内容,格式可自定义
        let timeStr = dateFormatter.string(from: start)
        let qrContent = "开始时间:\(timeStr),时长:\(time)分钟"
        let data = qrContent.data(using: .utf8)
        
        filter.setValue(data, 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()
    }
}

额外说明

  • 你原代码里ContentView中的Generate(start: $start)是笔误,已修正为GenerateQRCode(start: $start)
  • 示例中把整数作为「时长」参数整合到二维码内容,你可以根据需求调整文本拼接格式
  • 如果不需要用户输入整数,可直接在ContentView中给duration赋值固定值,或从其他数据源传递参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:10:56