【发布时间】:2021-06-23 14:36:02
【问题描述】:
struct ContentView: View {
@State var showModal = false
@State var text = "Empty"
var body: some View {
Button("show text") {
text = "Filled"
showModal = true
}
.sheet(isPresented: $showModal) {
VStack {
Text(text)
Button("print text") {
print(text)
}
}
}
}
}
我以为当点击“显示文本”按钮时,text 的值将设置为“已填充”,showModal 将设置为 true,这样sheet 中指定的屏幕将是显示,并且该屏幕上将显示“已填充”一词。
我以为它会显示“已填充”,但实际上显示“空”。
此外,当我使用print text 按钮打印text 时,控制台显示“已填充”。
为什么会这样?
当我点击目标屏幕上的按钮时,我缺少什么来显示我设置的值?
使用 Xcode12.4、Xcode12.5
添加新模式的代码。
struct ContentView: View {
@State var number = 0
@State var showModal = false
var body: some View {
VStack {
Button("set number 1") {
number = 1
showModal = true
print("set number = \(number)")
}
Button("set number 2") {
number = 2
showModal = true
print("set number = \(number)")
}
Button("add number") {
number += 1
showModal = true
print("add number = \(number)")
}
}
.sheet(isPresented: $showModal) {
VStack {
let _ = print("number = \(number)")
Text("\(number)")
}
}
}
}
在上面的代码中,当我第一次点击“set number 1”或“set number 2”时,目标屏幕显示“0”。无论您点击多少次同一个按钮,都会显示“0”。
但是,如果您在点击“设置编号 1”后点击“设置编号 2”,它将正常工作并显示“2”。如果您继续点击“设置数字1”,将显示“1”,应用程序将正常运行。
应用启动后第一次点击“加号”时,仍然会显示“0”,但如果再次点击“加号”,则会显示“2”并且应用会计数正确。
这说明即使@State变量更新了也可以启动目标屏幕的渲染,但是只有在目标屏幕中首先引用了@State变量时,它似乎没有被正确引用。
谁能解释它为什么会这样?
或者这看起来像 SwiftUI 中的错误?
【问题讨论】:
-
我认为 SwiftUI 会预加载表格 - 请参阅 stackoverflow.com/questions/65281559/…
-
@aheze 谢谢你的建议。与链接中的代码不同,我的代码在转换屏幕中使用@State 变量
text。如果它正在预加载,为什么它没有检测到text的变化并重新加载屏幕?我怎样才能让它重新加载? -
如果您使用预计值,您将看到变化。它不会显示更改,因为显示工作表会阻止重新加载结构。它只是坐在那里等到重新加载。您可以通过在工作表内容中使用
@Binding或使用以item作为参数的工作表来获取最新值
标签: swiftui