SwiftUI - 设置 @State 值会导致应用程序冻结

问题描述 投票:0回答:1

我遇到一个问题,以下代码导致我的应用程序挂起。所有这些都包含在我的应用程序顶层的导航堆栈中。

struct ParentView: View {
    var body: some View {
        List {
           Section {
                ForEach(0...5, id: \.self) { i in
                    NavigationLink {
                        ChildView()
                    } label: {
                        Text("Tap here")
                    }  
                }
            }
        }
    }
}

struct ChildView: View {
    @State var viewModel: ChildViewModel
    
    // MARK: - Lifecycle
    init() {
        _viewModel = State(initialValue: ChildViewModel())
    }
    
    var body: some View {
        Text("Hello, World!")
    }
}

@Observable class ChildViewModel {
    // Empty
}

我已将其隔离到

ChildView
类的初始化程序中,但无法弄清楚到底是什么导致它锁定。如果我将
ChildView
类更改为如下所示,它就可以正常工作:

struct ChildView: View {
    // MARK: - Lifecycle
    init() { }
    
    var body: some View {
        Text("Hello, World!")
    }
}

我也尝试过使用

State(wrappedValue: viewModel)
,但没有成功。我也尝试过分析该应用程序,但它似乎实际上也无法找出挂起的原因。

ios swift swiftui
1个回答
0
投票

您需要在导航视图闭包中添加导航链接代码块,如下所述:

struct ParentView: View {
   var body: some View {
       NavigationView {
           List {
              Section {
                   ForEach(0...5, id: \.self) { i in
                       NavigationLink {
                           ChildView()
                       } label: {
                           Text("Tap here")
                       }
                   }
               }
           }
       }       
   }
}

这就是原因,

导航链接 (NavigationLink) 是专门设计用于在由 NavigationView 管理的导航层次结构上下文中工作的视图。它依赖 NavigationView 提供必要的导航基础设施,包括导航栏、动画和整体导航流程。

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.