如何解决swiftui为什么不能分配可选内容?
为什么不能分配可选内容?
索引已分配,但仍未显示任何值
帮帮我,谢谢!
struct TestView: View {
@State private var index: Int? = nil
@State private var show: Bool = false
var body: some View {
vstack {
Text("Hello,world!")
.onTapGesture {
self.index = 1
self.show = true
print(self.index as Any)
}
}
.fullScreenCover(isPresented: $show) {
if let index = self.index {
Text("value:\(index)")
} else {
Text("not value")
}
}
}
}
Xcode 12.0 beta 2
解决方法
SwiftUI依赖于@State
变量,导致body
getter在更改时被重新计算。为了使它起作用,body
的获取方法必须以一定的方式 depend 依赖于@State
变量。您的代码中的问题是没有。
要看到这一点,我们可以将您的代码简化为一个简单的示例:
struct ContentView: View {
@State var message = "Hey"
@State var show: Bool = false
var body: some View {
VStack {
Button("Test") {
message = "Ho"
show = true
}
}
.sheet(isPresented: $show) {Text(message)}
}
}
我们将message
更改为Ho,但是在显示工作表时,它仍然显示“嘿”。这是因为没有任何事情可以使body
重新计算。您可能会说:Text(message)
这个短语呢?是的,但是那是封闭的。它已经被计算,并且message
已经被捕获。
要查看我的意思是对的,只需将显示message
的文本直接添加到主界面:
struct ContentView: View {
@State var message = "Hey"
@State var show: Bool = false
var body: some View {
VStack {
Button("Test") {
message = "Ho"
show = true
}
Text(message)
}
.sheet(isPresented: $show) {Text(message)}
}
}
现在您的代码可以使用了!当然,我们还在界面中显示了不需要的文本,但要点是,简单而简单的Text(message)
,而不是 not 足以引起整个{{1 }} body
更改时将重新计算getter。因此,我们已经正确解释了您要问的现象。
那么什么是 real 解决方案?如何使message
闭包能够按我们期望的那样在不的情况下向界面添加额外的Text?一种方法是这样的:
content
通过在闭包捕获列表中包含struct ContentView: View {
@State var message = "Hey"
@State var show: Bool = false
var body: some View {
VStack {
Button("Test") {
message = "Ho"
show = true
}
}
.sheet(isPresented: $show) {[message] in Text(message)}
}
}
,使message
的getter依赖于body
变量,现在代码可以按需运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。