【发布时间】:2021-01-16 21:20:11
【问题描述】:
我在 SwiftUI 中遇到了奇怪的行为,我不确定这是一个错误(我正在运行 Big Sur 和 XCode 12 测试版)还是我做错了。
当我将变量传递给NavigationLink 的目标视图时,该目标视图不会在变量更改时重新呈现。我已经隔离了这种行为以向您展示。这是一个完整的示例(仅适用于新的 SwiftUI 版本和 iOS 14):
import SwiftUI
struct ContentView: View {
@State var name: String
var body: some View {
NavigationView {
List {
NavigationLink(destination: MasterView(name: name)) {
Text("Show Name In Big")
}
Rectangle()
.frame(height: 1)
Text("Current Name: \(name)")
.font(.headline)
.foregroundColor(.accentColor)
Button(action: {
name = "Doug"
}, label: {
Text("Change Name")
.bold()
})
}
.listStyle(SidebarListStyle())
Text("Master")
Text("Detail")
}
}
}
struct MasterView: View {
let name: String
var body: some View {
Text(name)
.font(.title)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(name: "Bob")
}
}
这是一个演示行为的简短 gif(抱歉分辨率不好,这是一个分辨率更好的视频:https://www.youtube.com/watch?v=aTCex86tkYQ):
这是预期的行为吗?
编辑:
一个简单的示例来证明您不需要 Binding 来在值更改时重新呈现视图:
import SwiftUI
struct TestView: View {
@State var someVariable: String = "Old Value"
var body: some View {
VStack {
Text(someVariable)
SubView(someVariable: someVariable) // initialized without Binding
Button("Click to update variable") {
someVariable = "New Value"
}
}
}
}
struct SubView: View {
let someVariable: String
var body: some View {
Text(someVariable)
}
}
struct TestView_Previews: PreviewProvider {
static var previews: some View {
TestView()
}
}
谢谢!
【问题讨论】: