![](/img/trans.png)
[英]SwiftUI NavigationLink push in onAppear immediately pops the view when using @ObservableObject
[英]SwiftUI: NavigationLink pops immediately if used within ForEach
我在列表中的 ForEach 内部使用 NavigationLink 来构建一个基本的按钮列表,每个按钮都指向一个单独的详细信息屏幕。
当我点击任何列表单元格时,它会转换到该单元格的详细视图,但随后会立即弹出回到主菜单屏幕。
不使用 ForEach 有助于避免这种行为,但并不理想。
这是相关代码:
struct MainMenuView: View {
...
private let menuItems: [MainMenuItem] = [
MainMenuItem(type: .type1),
MainMenuItem(type: .type2),
MainMenuItem(type: .typeN),
]
var body: some View {
List {
ForEach(menuItems) { item in
NavigationLink(destination: self.destination(item.destination)) {
MainMenuCell(menuItem: item)
}
}
}
}
// Constructs destination views for the navigation link
private func destination(_ destination: ScreenDestination) -> AnyView {
switch destination {
case .type1:
return factory.makeType1Screen()
case .type2:
return factory.makeType2Screen()
case .typeN:
return factory.makeTypeNScreen()
}
}
如果MainMenuView
中有@State
、 @Binding
或@ObservedObject
,则主体本身会重新生成( menuItems
会再次计算),这会导致NavigationLink
无效(实际上是id
更改会这样做)。 因此,您不得从详细视图中修改menuItems
arrays id
-s。
如果每次都生成它们,请考虑设置一个常量 id 或存储在非修改部分中,例如在视图模型中。
也许我找到了这个错误的原因......
如果您使用 iOS 15(未找到 iOS 14),并且将代码 NavigationLink 写入 go 到项目中不同位置的相同视图,则会出现此错误。
所以我简单地制作了另一个具有不同目标视图名称但相同内容的视图......然后它就可以工作了......
你可以试试....
对不起我糟糕的英语......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.