标签: swiftui-navigationstack

为什么清除新的 iOS 16 SwiftUI NavigationPath 到“弹出到根目录”时不能平滑地返回到根视图?

我有一个新的 iOS 16 SwiftUI NavigationStack,其导航由 NavigationDestination 修饰符确定,效果很好。

我的问题是,如果您在堆栈深处有多个视图,那么在清除 NavigationPath 时,为什么它不能通过滑回根视图来平滑地进行动画处理?

如果您只有一层深度,它会起作用,但任何低于该深度的内容都会导致“弹出到根”仅跳回到根视图而没有滑动动画。

这是一个“功能”还是错误,还是我做错了什么?

重新创建问题的步骤

  • 运行下面的示例代码。
  • 单击第一个导航链接,然后单击“弹出到根视图” - 请注意,它“平滑地”滑回到根视图。
  • 单击第一个或第二个链接 - 然后单击显示视图 3 的“导航到视图 3”。
  • 然后单击“Pop to Root”,您会注意到它跳回到根视图而不是幻灯片。这就是我的问题——它应该跳回来还是滑回来?

发行演示

在此输入图像描述

演示代码(使用 Xcode 14.0 和 iOS 16.0):

import SwiftUI
struct DemoPop: View {

    @State private var path = NavigationPath()
    
    var body: some View {
        
        VStack {
            
            NavigationStack(path: $path) {
                   
                List {
                    Section("List One") {
                        NavigationLink("Navigate to View 1", value: "View 1")
                        NavigationLink("Navigate to View 2", value: "View 2")
                    }
                }
                .navigationDestination(for: String.self) …
Run Code Online (Sandbox Code Playgroud)

swiftui ios16 xcode14 swiftui-navigationstack

25
推荐指数
2
解决办法
5520
查看次数

只有根级导航目的地对于具有同质路径的导航堆栈有效

我正在尝试集成NavigationStack到我的 SwiftUI 应用程序中。

我有四种看法:CealUIAppOnBoardingViewUserTypeViewRegisterView

我想当用户按下 中的按钮时从 导航OnBoardingView到。UserTypeViewOnBoardingView

并且,当用户按下按钮时从 导航UserTypeViewRegisterViewUserTypeView

下面是我的 CealUIApp 代码

@main
struct CealUIApp: App {
    
    @State private var path = [String]()
    
    var body: some Scene {
        WindowGroup {
            NavigationStack(path: $path){
                OnBoardingView(path: $path)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

OnBoardingView

Button {
    path.append("UserTypeView")
}
label: {
    Text("Hello")
}
.navigationDestination(for: String.self) { string in
    UserTypeView(path: $path)
}
Run Code Online (Sandbox Code Playgroud)

UserTypeView

Button {
    path.append("RegisterView")
}
label: …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui swiftui-navigationstack

10
推荐指数
2
解决办法
4446
查看次数

为什么 iOS 16 中弹出时导航标题显示方式会从大变为内联?

当我从具有内联显示模式的推送视图中弹出时,最初较大的父视图的显示模式更改为内联,并且用户必须向下滚动标题才能恢复到其原始模式。

问:如何确保设置视图上始终显示大标题?

我使用的是 Xcode 14 beta 6,在预览中它不会发生,但在运行 iOS 16 的模拟器上它会发生。

设置视图

struct SettingsView: View {
    @State private var isPresentingChangePasswordView = false
    
    var body: some View {
        Form {
            Section {
                NavigationLink(destination: EmptyView()) {
                    Label("Account Details", systemImage: "person")
                }
                NavigationLink {
                    Form {
                        Button("Change Password") {
                            isPresentingChangePasswordView = true
                        }
                    }
                    .navigationTitle("Password & Security")
                    .navigationBarTitleDisplayMode(.inline)
                } label: {
                    Label("Password & Security", systemImage: "lock")
                }
                NavigationLink(destination: EmptyView()) {
                    Label("Manage Subscription", systemImage: "crown")
                }
                Button {
                    
                } label: {
                    HStack {
                        Label …
Run Code Online (Sandbox Code Playgroud)

swift swiftui swiftui-navigationview ios16 swiftui-navigationstack

9
推荐指数
0
解决办法
1140
查看次数

不完整的向后滑动手势导致 NavigationPath 管理不善

我正在下面的示例代码中寻找以下错误的解决方案。我尝试使用 SwiftUI 4 和 iOS 16.0 导航 API 变更集实现导航器模式。

下面的示例将在 Xcode 14.0+ 中编译,如果在模拟器或 iOS 16.0 设备中运行,将会产生我所描述的错误。我想知道这是缺乏知识还是平台错误。通过我的日志,我可以看到,当我用不完整的向后滑动手势引发错误时,导航路径的元素计数上升到 2,而实际上它应该在根处返回到 0,并且仅在第一层保留 1 个元素看法。

有没有办法可以更好地管理此类视图层次结构的路径?或者,这是一个平台级错误吗?

import SwiftUI

enum AppViews: Hashable {
    case kombuchaProductsView
    case coffeeProductsView
    case customerCartView
}

struct RootView: View {
    @StateObject var drinkProductViewModel = DrinkProductViewModel()
    
    var body: some View {
        NavigationStack(path: self.$drinkProductViewModel.navPath) {
            List {
                Section("Products") {
                    NavigationLink(value: AppViews.kombuchaProductsView) {
                        HStack {
                            Text("View all Kombuchas")
                            Spacer()
                            Image(systemName: "list.bullet")
                        }
                    }
                    NavigationLink(value: AppViews.coffeeProductsView) {
                        HStack {
                            Text("View all Coffees")
                            Spacer()
                            Image(systemName: "list.bullet")
                        } …
Run Code Online (Sandbox Code Playgroud)

drag swiftui swiftui-navigationlink ios16 swiftui-navigationstack

9
推荐指数
3
解决办法
1537
查看次数

SwiftUI - IOS 16 - 如何在 MVVM 架构中使用新的 NavigationStack 和 NavigationPath 进行编程导航?

描述

对于编程式导航,您之前可以使用NavigationLink(isActive:, destination:, label:) ,当isActive参数为 true时,它​​将触发导航。在 IOS 16 中,这已被弃用,并引入了NavigationStack、NavigationLink(value:, label:)NavigationPath 。

要了解这些的用法,请点击链接:

https://developer.apple.com/documentation/swiftui/migration-to-new-navigation-types https://www.hackingwithswift.com/articles/250/whats-new-in-swiftui-for-ios-16(搜索NavigationStack)

我的问题是,如果我想在不同的视图及其 ViewModel 中使用它,我应该如何使用和维护包含导航堆栈内容的数组(如 NavigationPath 对象)?

正如您在下面的代码中看到的,我创建了一个 NavigationPath 对象来将导航堆栈保存在 BaseView 或 BaseView.ViewModel 中。这样我就可以从该 BaseView 到其他页面(Page1、Page2)进行编程导航,这很棒。

但是,如果我转到 Page1 并尝试以编程方式从那里导航到 Page2,我需要访问原始的 NavigationPath 对象,即我在 BaseView 中使用的对象。

访问这个原始对象的最佳方式是什么?

我可能误解了这个新功能的用法,但如果您有任何可能的从 ViewModel 进行编程导航的解决方案,我会很高兴看到它:)

代码

我尝试做的事情:

struct BaseView: View {
    @StateObject var viewModel = ViewModel()
    
    var body: some View {
        NavigationStack(path: $viewModel.paths) {
            VStack {
                Button("Page 1", action: viewModel.goToPage1)
                Button("Page 2", action: viewModel.goToPage2)
            }
            .navigationDestination(for: String.self) { …
Run Code Online (Sandbox Code Playgroud)

mvvm ios swift swiftui swiftui-navigationstack

9
推荐指数
1
解决办法
5654
查看次数

我如何滥用 NavigationStack?

我在尝试使用新的 NavigationStack 时有一个小代码示例,但出现错误:A NavigationLink ispresenting a value of type \xe2\x80\x9cTransactionRoute\xe2\x80\x9d but there is nomatching navigation destination from链接的位置。链接无法激活。

\n

我究竟做错了什么?

\n
    import SwiftUI\n\n    struct TransactionRoute: Identifiable {\n        let id = UUID()\n        let realm: TransactionRealm\n        let transaction: String?\n    }\n\n    extension TransactionRoute: Equatable, Hashable {\n        static func == (lhs: TransactionRoute, rhs: TransactionRoute) -> Bool {\n            lhs.id == rhs.id\n        }\n\n        public func hash(into hasher: inout Hasher) {\n            hasher.combine(id)\n        }\n    }\n\n    enum TransactionRealm: Int {\n        case basic\n        case upcoming\n        case recurring\n    }\n\n    struct ContentView: …
Run Code Online (Sandbox Code Playgroud)

swift swiftui swiftui-navigationstack

7
推荐指数
1
解决办法
3468
查看次数

在 SwiftUI 中使用 NavigationStack 呈现工作表视图

我试图弄清楚是否有办法在 iOS 16 中使用新的 NavigationStack 打开工作表,但似乎找不到方法。

因此,可以使用以下命令打开工作表:

.sheet(isPresented: $isShowing)
Run Code Online (Sandbox Code Playgroud)

但是使用新的 NavigationStack,您将拥有一个呈现类型的数组:

.navigationDestination(for: SomeType.self, destination: { route in
Run Code Online (Sandbox Code Playgroud)

如果我能以某种方式定义当呈现特定目的地时它将作为工作表打开而不是使用模式导航,那就太棒了。

有谁知道这是否可以实现?:)

swiftui swiftui-sheet swiftui-navigationstack

7
推荐指数
1
解决办法
3336
查看次数

NavigationStack 不受环境对象更改的影响

我尝试使用 @EnvironmentObject 使用简单的包装器 ObservableObject 将 @Published 导航路径传递到 SwiftUI NavigationStack 中,并且代码构建没有问题,但使用 @EnvironmentObject 没有任何效果。这是一个仍然存在问题的简化示例:

import SwiftUI

class NavigationCoordinator: ObservableObject {
    @Published var path = NavigationPath()

    func popToRoot() {
        path.removeLast(path.count)
    }
}

struct ContentView: View {
    @StateObject var navigationCoordinator = NavigationCoordinator()

    var body: some View {
        NavigationStack(path: $navigationCoordinator.path, root: {
            FirstView()
        })
            .environmentObject(navigationCoordinator)
    }
}

struct FirstView: View {
    var body: some View {
        VStack {
            NavigationLink(destination: SecondView()) {
                Text("Go To SecondView")
            }
        }
            .navigationTitle(Text("FirstView"))
    }
}

struct SecondView: View {
    var body: …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationstack

6
推荐指数
1
解决办法
2745
查看次数

macOS NavigationStack 使用推送和弹出动画

如何在macOS中设置 Push/Pop 动画NavigationStack?因为目前没有动画,我想推送/弹出控制器向右滑动(向左滑动),类似于AppStore应用程序

enum Nav {
    case a
}

struct MainView: View {
  
    var body: some View {
        NavigationStack {
            NavigationLink(value: Nav.a) {
                Text("Go to a")
            }
            .navigationDestination(for: Nav.self) { path in
                switch path {
                case .a:
                    Text("a")
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-animation swiftui-navigationstack

6
推荐指数
0
解决办法
225
查看次数

处理 SwiftUI 中的嵌套 NavigationStack?

我环顾四周,但没有看到任何这方面的信息。如果我想在 SwiftUI 中拥有多个导航堆栈,并拥有多个添加到不同导航堆栈的导航链接,我该怎么做?在我的用例中,我使用选项卡视图,所以我会是这样的:

NavigationStack(path: $globalNavigationStack) {
  TabView {
    PrimaryView()
    SecondaryView()
  }
}
Run Code Online (Sandbox Code Playgroud)

那么也许在 PrimaryView 中:

struct PrimaryView: View {
  var body: some View {
    NavigationStack(path: $localNavigationStack) {
       NavigationLink(value: SomeType.self) {
         Button("This should add to local stack")
       }
       .navigationDestination(for: SomeType.val) { someType in
          ViewOnLocalStack() 
       }

       NavigationLink(value: SomeType.self) {
         Button("This should add to global stack")
       }
       .navigationDestination(for: SomeType.val) { someType in
          ViewOnGlobalStack() 
       }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但第二个NavigationLink将添加到本地堆栈。假设我有权访问全局路径,如何使第二个路径添加到全局路径?我尝试的是这样的:

NavigationStack(path: $globalNavigationStack) {
  TabView {
    PrimaryView()
    SecondaryView()
  }
}
.navigationDestination(for: SomeType.val) { someType …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationstack

6
推荐指数
0
解决办法
1919
查看次数