SwiftUI StackNavigationViewStyle 不会更新 NavigationLink 选择状态

时间:2020-12-22 09:55:57

标签: ios swift swiftui

我意识到我的 iOS 应用确实有双列导航视图样式。与单列导航相比,较大的 iPhone(如 iPhone 11 Pro Max)的拆分视图。

我试图根据 SwiftUI: unwanted split view on iPad 通过将 .navigationViewStyle(StackNavigationViewStyle()) 修饰符应用于 NavigationView 来摆脱这种不需要的拆分视图。

然而,这引入了一个新问题,即 SwiftUI 在从详细视图返回后不会更新 NavigationLink 选择状态。返回后,该链接仍显示为活动状态。再次删除 .navigationViewStyle(StackNavigationViewStyle()) 后,选择状态正确更新,所以我想我错过了一些东西。

我创建了一个最小的可重现示例项目。请看下面的代码。

此图演示了使用 NavigationLink 修饰符时从详细视图返回后未更新 .navigationViewStyle(StackNavigationViewStyle()) 选择状态的问题。

use of StackNavigationViewStyle does not update NavigationLink selection state after returning from detail view

最小可重现的示例项目:

import SwiftUI

@main
struct TestSwiftUIApp: App {
    var body: some Scene {
        WindowGroup {
            View1()
        }
    }
}
struct View1: View {
    var body: some View {
        NavigationView {
            List {
                NavigationLink(
                    destination: View2(),
                    label: {
                        Text("View2")
                    }
                ).isDetailLink(false)
                NavigationLink(
                    destination: View2(),
                    label: {
                        Text("View2")
                    }
                ).isDetailLink(false)
            }.listStyle(InsetGroupedListStyle())
            .navigationTitle("View1")
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}
struct View2: View {
    @State var presentView3: Bool = false
    
    var body: some View {
        List {
            Text("Foo")
            NavigationLink("View3",
                           destination: View3(presentView3: $presentView3),
                           isActive: $presentView3
            ).isDetailLink(false)
            Text("Bar")
        }
        .listStyle(InsetGroupedListStyle())
        .navigationTitle("View 2")
    }
}
struct View3: View {
    @Binding var presentView3: Bool

    @State
    var isAddViewPresented: Bool = false

    var body: some View {
        List {
            Button(action: {presentView3 = false}, label: {
                Text("Dismiss")
            })
        }
        .listStyle(InsetGroupedListStyle())
        .navigationTitle("View3")
        .toolbar {
            ToolbarItem {
                Button(action: {isAddViewPresented.toggle()}, label: {
                    Label("Add", systemImage: "plus.circle.fill")
                })
            }
        }
        .sheet(isPresented: $isAddViewPresented, content: {
            Text("DestinationDummyView")
        })
    }
}

0 个答案:

没有答案
相关问题