【问题标题】:Recursive SwiftUI views递归 SwiftUI 视图
【发布时间】:2022-01-26 04:06:57
【问题描述】:

由于某种原因,我无法显示在 ForEach 循环中调用自身的 SwiftUI 视图。应用程序在尝试显示此视图时挂起然后崩溃:

struct LoopView: View {
    let loop: Loop

    var body: some View {
        HStack {
            Text(String(loop.multiplier))
                .font(.title)
            Text("x")
            VStack {
                // ### THE PROBLEM IS HERE ###
                if let loops = loop.loops {
                    ForEach(loops, id: \.id) { innerLoop in
//                        Text(String(innerLoop.multiplier)) // << This works
                        LoopView(loop: innerLoop) // << This causes the system to hang
                    }
                } else {
                    // This stuff here is fine
                    if let components = loop.components {
                        ForEach(components, id: \.id) { component in
                            ComponentView(component: component)
                        }
                    }
                }
            }
        }
    }
}

struct LoopView_Previews: PreviewProvider {
    static let moc = DataController.preview.container.viewContext

    static var previews: some View {
        let outterLoop = Loop(context: moc)
        outterLoop.id = UUID()
        outterLoop.multiplier = 5
        outterLoop.addToInternalLoops(DataController.exampleLoop())

        // vvv Does not change outcome if commented out vvv
        outterLoop.addToInternalLoops(DataController.exampleLoop())

        return LoopView(loop: outterLoop)
    }
}

根据 cmets,我可以很好地访问循环项目的属性,这意味着循环没有任何问题,并且可以访问元素。但是,我无法递归使用我的loopinnerLoop 不包含 loop 意味着它只会在深入一层后停止递归。

我使用的是 Xcode 13.2.1。感谢您的帮助!

【问题讨论】:

  • 这是关于LoopComponentView 类型的尝试猜测问题吗?
  • 这是关于LoopComponentView 很好。
  • DataController.exampleLoop() 在每次调用时返回相同的 Loop 对象还是一个新对象?
  • 同一个。它被添加到NSOrderedSet(默认Core Data 一对多关系)。如果只添加一个,则没有区别。
  • 所以你有一个一对多的关系,在一个方向上命名为internalLoops,在另一个方向上命名为loops,这是正确的,如果是,那是哪个?

标签: swift recursion core-data swiftui


【解决方案1】:

进行了更多调试,发现错误来自我的自引用一对多实体需要对自身进行反向引用。详情请见this post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-18
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多