当用户更改 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()
}
}
答案 0 :(得分:0)
您不需要 QRView
中的状态包装器,它保留初始值并防止属性的外部更新,因此这里是一个修复:
struct QRView: View
{
var string: String // << here !!
// .. other code
}