1

好的,发生了一些奇怪的事情,我想看看其他人是否有这个问题。

考虑以下ViewModel具有一个已发布属性的类以从视图中使用:

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("\($0)")
                }
            }
            .navigationBarTitle("Test")
        }
    }
}

而这个子视图:

struct ChildView: View {
    @Binding var isActive: Bool
    var body: some View {
        Button("Go back", action: { isActive = false })
    }
}

问题

预期的结果是点击“转到子视图”,导航到子视图并点击“返回”返回主视图 - 它应该使用isActive绑定导航回来。

但实际上,“返回”按钮不起作用。

但是,如果我ForEach从主视图中的表单中删除该元素,则该按钮将再次起作用。它看起来像ForEach打破了一切。

其他发现:

  1. 更改FormVStack解决问题
  2. 使用 struct 和 a@State也解决了这个问题
  3. 将其提取ForEach到子视图可以解决问题,但是一旦我将视图模型或其一部分作为绑定或 ObservedObject 传递给子视图 - 它仍然损坏

如果代码存在逻辑问题或者是 SwiftUI 错误,有什么建议吗?任何解决方法的建议?

预期行为的视频:

https://i.stack.imgur.com/BaggK.gif

苹果开发者论坛讨论:https ://developer.apple.com/forums/thread/674127

更新

看起来该问题已在最新的 iOS 14.5 Beta 2 中得到修复

4

1 回答 1

0

该问题已在 iOS 14.5 上修复

于 2021-04-24T09:50:45.393 回答