首页 > 解决方案 > 仅状态更改会更新某些视图

问题描述

当用户更改 TextField 中的 url 时,附加程序不会更改 QRView 中的 QR 码,但 QR 码下方的 Text 视图会更新。我错过了什么?

我在没有文本字段的情况下尝试了此操作,还添加/替换了 MapView 以查看是否会触发不同的可表示视图。MapView 也没有触发,删除 Text 视图也没有改变任何东西。

import SwiftUI
import CoreImage.CIFilterBuiltins

struct ContentView: View
{
    @State var url = "https://www.nytimes.com"
    var body: some View
    {
        VStack
        {
            Spacer()
            QRView(string: "URL:\(url))")
            Text(url)
            Spacer()
            HStack
            {
                Text("URL")
                TextField("URL",text: $url)
            }
            .padding()
        }
    }
}

struct QRView: View
{
    @State var string:String
    
    var body: some View
    {
        Image(uiImage: generateQRCode(from: string))
            .interpolation(.none)
            .resizable()
            //.aspectRatio(contentMode: .fit)
            .frame(width: 200, height: 200)
    }
}

//MARK:- QRCode

func generateQRCode(from string: String) -> UIImage
{
    let context = CIContext()
    let filter = CIFilter.qrCodeGenerator()
    
    let data = Data(string.utf8)
    filter.setValue(data, forKey: "inputMessage")
    
    if let outputImage = filter.outputImage {
        if let cgimg = context.createCGImage(outputImage, from: outputImage.extent)
        {
            return UIImage(cgImage: cgimg)
        }
    }
    
    return UIImage(systemName: "xmark.circle") ?? UIImage()
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

标签: swiftui

解决方案


您不需要 in 中的状态包装器QRView,它保留初始值并防止属性的外部更新,所以这里是一个修复:

struct QRView: View
{
    var string: String      // << here !!

// .. other code
}

推荐阅读