SwiftUI 导航链接和@State 在“onAppear()”中有问题

Posted

技术标签:

【中文标题】SwiftUI 导航链接和@State 在“onAppear()”中有问题【英文标题】:SwiftUI navigation link and @State have problem in "onAppear()" 【发布时间】:2021-10-07 14:07:52 【问题描述】:

我有一个视图堆栈,例如 root -> subViewA -> subViewB,我将一个 @State var 传递给彼此的视图,这个 var 是控制显示或隐藏的东西,这是我的代码:

struct RootView: View 
    
    @State var show: Bool = true
    
    var body: some View 
        ZStack(alignment: Alignment(horizontal: .center, vertical: .bottom)) 
            NavigationView 
                NavigationLink(
                    destination: SubViewA(show: $show),
                    label: 
                        Text("to Sub View A")
                            .onAppear 
                                show = true
                                print("Conntent View appear")
                            
                    )
            
            
            RoundedRectangle(cornerRadius: 20)
                .frame(width: 400, height: 70)
                .foregroundColor(.blue)
                .offset(y: show ? 0 : 500)
        
    

struct SubViewA: View 
    
    @Binding var show: Bool
    
    var body: some View 
        NavigationLink(
            destination: SubViewB(show: $show),
            label: 
                Text("to Sub View B")
                    .onAppear 
                        show = true
                        print("sub View A appear")
                    
            )
    

struct SubViewB: View 
    
    @Binding var show: Bool
    
    var body: some View 
        Text("Sub View B")
            .onAppear 
                show = false
                print("Sub View B appear")
            
    


控制台输出是:

Conntent View appear
sub View A appear
2021-08-02 15:22:58.284604+0800 NavigationLink[32349:489749] [Assert] displayModeButtonItem is internally managed and not exposed for DoubleColumn style. Returning an empty, disconnected UIBarButtonItem to fulfill the non-null contract.
Sub View B appear
Conntent View appear

当导航到 subViewB 时,输出是“出现子视图 B”和“出现内容视图”,为什么它会打印 rootView 的 onappear() 信息?我该如何解决?

【问题讨论】:

在 macos 12.beta、xcode 13.beta、target ios 15 和 macCatalyst 上按预期工作,对我来说没有任何问题。在旧系统上可能会有所不同。 感谢您的回复。我的 macOS 11.4,Xcode 12.5.1,目标 iOS 14。这可能是系统错误? 绑定是一种双向连接状态是事实的来源。您只有一个触发所有导航链接的事实来源。 @loremipsum,我不明白你的意思,你能告诉我更多吗?谢谢! 你的状态显示和隐藏所有链接 【参考方案1】:

我有同样的问题.... 似乎发生在 iOS 15.0 设备下。 我的设备版本是 iOS 14.4。但 iOS 15.2 模拟器运行良好。

rootView 的 onAppear 会在第二个子级推送时被调用,在弹出所有视图时也会调用 rootView 的 onAppear。

【讨论】:

这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review

以上是关于SwiftUI 导航链接和@State 在“onAppear()”中有问题的主要内容,如果未能解决你的问题,请参考以下文章

@State 错误我位于导航栏的 TextField - SwiftUI

文本字段点击正在关闭 SwiftUI 中的导航链接

导航链接在 SwiftUI 中只能使用一次

SwiftUI @State 变量没有被取消初始化

SwiftUI 和双导航栏

使用 swiftUI 中的按钮导航到新屏幕