swiftui - 仅状态更改会更新某些视图
问题描述
当用户更改 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()
}
}
解决方案
您不需要 in 中的状态包装器QRView
,它保留初始值并防止属性的外部更新,所以这里是一个修复:
struct QRView: View
{
var string: String // << here !!
// .. other code
}
推荐阅读
- three.js - Threejs在运行时更改图像
- javascript - 使用 axios 在 ReactJS web worker 中调用 web api 方法
- c# - 从 ASP.Net 生成子进程失败
- java - ElasticSearch SpringBoot + Spring Data:java.lang.IllegalStateException:在接口上找不到合适的构造函数
- docker - 通过 dokku 只停止一个 docker 容器
- guzzle - 尝试使用 POSTMAN 注册用户时出现 Laravel 5.6.26 护照问题
- javascript - & > a 在 jQuery 选择器中
- php - Yii2 日期格式从 2 位年份到 4 位数字
- python - 为编译运行时关键字编写一个正则表达式
- javascript - 使用 AJAX 和 PHP 删除用户记录时面临的问题