如何有条件地防止按下导航后退按钮?

问题描述 投票:0回答:1

我有视图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

ios swift swiftui uinavigationbar
1个回答
0
投票

首先,您需要选择正确的导航视图:

来自

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.