SwiftUI通过将NavigationLink标记设置为nil来解除视图
我试图在SwiftUI中实现编程视图pop的逻辑 我在项目上设置了一个标记,并为所选项目创建了一个相应的变量,但当我单击DetaiView屏幕上的按钮时,什么都没有发生 如果我使用VStack而不是List,或者使用presentationMode环境变量来释放屏幕,那么问题就会消失,但是我想使用List 代码: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:一些观点{
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()
}
}
}
}