SwiftUI通过将NavigationLink标记设置为nil来解除视图

SwiftUI通过将NavigationLink标记设置为nil来解除视图,swiftui,swiftui-list,swiftui-navigationlink,Swiftui,Swiftui List,Swiftui Navigationlink,我试图在SwiftUI中实现编程视图pop的逻辑 我在项目上设置了一个标记,并为所选项目创建了一个相应的变量,但当我单击DetaiView屏幕上的按钮时,什么都没有发生 如果我使用VStack而不是List,或者使用presentationMode环境变量来释放屏幕,那么问题就会消失,但是我想使用List 代码: struct ContentView:View{ @状态变量数据:[Int]=[1,2,3,4,5] @状态变量selectedItem:Int?=nil var body:一些观点{

我试图在SwiftUI中实现编程视图pop的逻辑

我在项目上设置了一个标记,并为所选项目创建了一个相应的变量,但当我单击DetaiView屏幕上的按钮时,什么都没有发生

如果我使用VStack而不是List,或者使用presentationMode环境变量来释放屏幕,那么问题就会消失,但是我想使用List

代码:

struct ContentView:View{
@状态变量数据:[Int]=[1,2,3,4,5]
@状态变量selectedItem:Int?=nil
var body:一些观点{
导航视图{
//NavigationLink(//这可以让您轻松工作
//目的地:详细视图(selectedItem:$selectedItem),
//标签:123,
//选择:$selectedItem,
//标签:{Text(\(123)”)}
//            )
在此处列出{//VStack使解雇生效
ForEach(数据,id:\.self){中的元素
导航链接(
目的地:详细视图(selectedItem:$selectedItem),
标签:元素,
选择:$selectedItem,
标签:{Text(“\(元素)”)}
)
.isDetailLink(错误)
}
}
}
}
}
结构详细视图:视图{
@绑定变量selectedItem:Int?
//@Environment(\.presentationMode)变量presentationMode:绑定
var body:一些观点{
VStack{
文本(“细节”)
按钮(“按钮”){
selectedItem=nil//变量设置为nil,但不发生任何变化
//presentationMode.wrappedValue.Disclease()
}
}
}
}
我是做错了什么,还是它是一个迅捷的错误


谢谢大家!

是的,它看起来像是iOS 14.2中引入的错误/更改。我建议您使用
presentationMode.wrappedValue.dislose()
,不幸的是,如果调用此方法的视图不在顶部,则此方法不起作用。例如:Root->View1->View2->TopView在View1中调用dismise将不起任何作用。对我来说,最好的解决方案是使用ScrollView+VStack+foreach。您可以尝试使用
isActive
进行
NavigationLink
并提供自定义绑定。我已经检查过了,可以用了。但我还是建议你去归档一个bug。
struct ContentView: View {
    
    @State var data: [Int] = [1, 2, 3, 4, 5]
    @State var selectedItem: Int? = nil
    
    var body: some View {
        NavigationView {
//            NavigationLink( // This make dismiss work
//                destination: DetailView(selectedItem: $selectedItem),
//                tag: 123,
//                selection: $selectedItem,
//                label: { Text("\(123)") }
//            )
            List { // VStack here make dismiss work
                ForEach(data, id: \.self) { element in
                    NavigationLink(
                        destination: DetailView(selectedItem: $selectedItem),
                        tag: element,
                        selection: $selectedItem,
                        label: { Text("\(element)") }
                    )
                    .isDetailLink(false)
                }
            }
        }
    }
}

struct DetailView: View {
    @Binding var selectedItem: Int?
//    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    
    var body: some View {
        VStack {
            Text("DETAIL")
            Button("BUTTON") {
                selectedItem = nil // Variable set to nil but nothing happens
//                presentationMode.wrappedValue.dismiss()
            }
        }
    }
}