我有视图A:
struct Dummy: View {
var body: some View {
NavigationStack{
NavigationLink(destination: ViewB()) {
Image(systemName: "gear") // placeholder systemname
.padding()
.background(.ultraThinMaterial)
.clipShape(.circle)
}
.navigationTitle("Home")
}
}
}
和视图 B,其中有一个文本字段,绑定值设置为“”(空字符串):
struct ViewB: View {
@State private var name: String = ""
var body: some View {
NavigationStack {
VStack {
Text("Your name is \(name)")
.font(.title)
.padding()
Divider()
TextField("Name", text: $name)
.textFieldStyle(.roundedBorder)
.padding()
}
}
}
}
我想做的是,仅当绑定值
name
为空时,阻止用户通过按导航栏上的后退按钮返回到视图A。当用户开始输入时,值会发生变化并设置为某个值,可以再次按后退按钮返回。
我寻找解决方案但一无所获。 我尝试过使用
.navigationBarBackButtonHidden()
修饰符,但它只接受 Bool 而不是 Binding首先,您需要选择正确的导航视图:
navigationBarBackButtonHidden(_:)
文档:
此修饰符仅当此视图位于 NavigationView 内部且在 NavigationView 中可见时才生效。
第二,你希望当名称为空时隐藏导航栏,所以相应地写:
.navigationBarBackButtonHidden(name == "")
就我个人而言,我更喜欢写等价的:
.navigationBarBackButtonHidden(name.isEmpty)
总结一下,
ViewB
看起来像这样:
struct ViewB: View {
@State private var name: String = ""
var body: some View {
NavigationView { // <- Changed
VStack {
Text("Your name is \(name)")
.font(.title)
.padding()
Divider()
TextField("Name", text: $name)
.textFieldStyle(.roundedBorder)
.padding()
}
}
.navigationBarBackButtonHidden(name.isEmpty) // <- Added
}
}