仅状态更改更新某些视图

时间:2021-01-26 15:44:25

标签: swiftui

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

我在没有文本字段的情况下尝试了此操作,并且还添加/替换了 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()
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

// .. other code
}