尝试使用 NavigationLink 时,带有 StateObject、Form 元素和 ForEach 的 SwiftUI View 会破坏绑定
SwiftUI View with StateObject, a Form element and a ForEach breaks bindings when trying to use NavigationLink Inside the form
好的,发生了一些奇怪的事情,我想看看是否还有其他人有这个问题。
考虑以下 ViewModel
class 和一个已发布的 属性 从视图中使用:
final class ViewModel: ObservableObject {
@Published var isActive = false
}
使用此视图时:
struct MainView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
NavigationView {
Form {
NavigationLink (
destination: ChildView(isActive: $viewModel.isActive),
isActive: $viewModel.isActive,
label: { Text("Go to child view") }
)
// Adding this ForEach causes the NavigationLink above to have a broken binding
ForEach(1..<4) {
Text("\([=11=])")
}
}
.navigationBarTitle("Test")
}
}
}
还有这个子视图:
struct ChildView: View {
@Binding var isActive: Bool
var body: some View {
Button("Go back", action: { isActive = false })
}
}
问题
预期的结果是点击“转到子视图”,导航到子视图并点击“返回”到 return 到主视图 - 它应该使用 [=14= 导航回来]绑定。
但实际上,“返回”按钮不起作用。
BUT 如果我从主视图的表单中删除 ForEach
元素,该按钮将再次起作用。看起来 ForEach
破坏了一切。
其他发现:
- 将
Form
更改为 VStack
可解决问题
- 使用结构和
@State
也解决了这个问题
- 将
ForEach
提取到子视图可以解决问题,但是一旦我将视图模型或其一部分作为绑定或作为 ObservedObject 传递给子视图 - 它仍然损坏
如果代码存在逻辑问题或者是 SwiftUI 错误,有什么可以建议的吗?
有任何解决方法的建议吗?
预期行为的视频:
https://i.stack.imgur.com/BaggK.gif
Apple 开发者论坛讨论:https://developer.apple.com/forums/thread/674127
更新
看起来问题已在最新的 iOS 14.5 Beta 2
中修复
问题已在 iOS 14.5
上修复
好的,发生了一些奇怪的事情,我想看看是否还有其他人有这个问题。
考虑以下 ViewModel
class 和一个已发布的 属性 从视图中使用:
final class ViewModel: ObservableObject {
@Published var isActive = false
}
使用此视图时:
struct MainView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
NavigationView {
Form {
NavigationLink (
destination: ChildView(isActive: $viewModel.isActive),
isActive: $viewModel.isActive,
label: { Text("Go to child view") }
)
// Adding this ForEach causes the NavigationLink above to have a broken binding
ForEach(1..<4) {
Text("\([=11=])")
}
}
.navigationBarTitle("Test")
}
}
}
还有这个子视图:
struct ChildView: View {
@Binding var isActive: Bool
var body: some View {
Button("Go back", action: { isActive = false })
}
}
问题
预期的结果是点击“转到子视图”,导航到子视图并点击“返回”到 return 到主视图 - 它应该使用 [=14= 导航回来]绑定。
但实际上,“返回”按钮不起作用。
BUT 如果我从主视图的表单中删除 ForEach
元素,该按钮将再次起作用。看起来 ForEach
破坏了一切。
其他发现:
- 将
Form
更改为VStack
可解决问题 - 使用结构和
@State
也解决了这个问题 - 将
ForEach
提取到子视图可以解决问题,但是一旦我将视图模型或其一部分作为绑定或作为 ObservedObject 传递给子视图 - 它仍然损坏
如果代码存在逻辑问题或者是 SwiftUI 错误,有什么可以建议的吗? 有任何解决方法的建议吗?
预期行为的视频:
https://i.stack.imgur.com/BaggK.gif
Apple 开发者论坛讨论:https://developer.apple.com/forums/thread/674127
更新
看起来问题已在最新的 iOS 14.5 Beta 2
中修复问题已在 iOS 14.5
上修复