标签: swiftui-navigationsplitview

SwiftUI - NavigationSplitView 内的 NavigationStack 内的嵌套链接不起作用

我正在尝试 ipadOS16/macOS13 中提供的新导航 API,但在弄清楚如何在 macOS 13 上将 NavigationSplitView、NavigationStack 和 NavigationLink 组合在一起时遇到了一些麻烦(在 Macbook Pro M1 上进行测试)。相同的代码在 ipadOS 上可以正常工作。

我正在使用两列 NavigationSplitView。在“详细信息”部分中,我有一个SampleModel1包含在 NavigationStack 中的实例列表。在列表中,我已为SampleModel1SampleModel2实例应用了 navigationDestination。

SampleModel1当我从列表中选择一个实例时,我会导航到一个详细视图,该视图本身包含一个SampleModel2实例列表。我的目的是在单击其中一个实例时进一步导航到 NavigationStack SampleModel2,但不幸的是这似乎不起作用。实例SampleModel2是可选择的,但没有发生导航。

当我完全删除 NavigationSplitView 并仅使用 NavigationStack 时,问题不会出现,并且我可以成功导航到SampleModel2实例。

这是我的示例代码:


import SwiftUI

@main
struct testingnavigationApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

// Sample model definitions used to trigger navigation with navigationDestination API.
struct SampleModel1: Hashable, Identifiable …
Run Code Online (Sandbox Code Playgroud)

swift swiftui swiftui-navigationsplitview macos-ventura

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

使用 NavigationSplitView 时 iOS 16.1 上的 NavigationTitle 延迟

还有其他人在 iOS 16.1 中遇到这个问题吗?NavigationSplitViewNavigationTitle视图加载后加载?\xe2\x80\x93 在 iOS 16.0 上运行良好。(https://i.stack.imgur.com/G0IUG.gif

\n

它实际上是相同的代码,但它只在 iOS 16.1 上给我带来了问题。

\n

更新:这在 iOS 16.2 和 16.3 上仍然是一个问题。

\n

@Hunter更新:Apple 似乎已在 iOS 16.4 Beta 1 上修复了此问题。

\n

swiftui ios16 swiftui-navigationsplitview navigationsplitview

8
推荐指数
0
解决办法
283
查看次数

如何在每个选择更改的 NavigationSplitView 详细信息上运行“task”或“onAppear”?

我试图NavigationSplitView与其中DetailView包含taskor 的a 一起使用onAppear,但它似乎只运行一次。

enum MenuItem: String, Hashable, Identifiable, CaseIterable {
    case menu1
    case menu2
    case menu3
    case menu4
    case menu5
    
    var id: String { rawValue }
}

struct ContentView: View {
    @State var selection: MenuItem?
    
    var body: some View {
        NavigationSplitView {
            List(MenuItem.allCases, selection: $selection) { item in
                NavigationLink(value: item) {
                    Text(item.rawValue)
                }
            }
        } detail: {
            if let selection {
                DetailView(menuItem: selection)
            } else {
                Text("Default")
            }
        }
    }
}

struct …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationlink swiftui-navigationsplitview

6
推荐指数
2
解决办法
966
查看次数

如何在 SwiftUI 中显示 iPad 和纵向模式下的侧边栏

我在 iPad 上有一个主细节应用程序,当以纵向模式运行该应用程序时,侧边栏被隐藏。我需要按“后退”按钮才能打开侧边栏。

谁能帮我默认显示侧边栏?我找到了一个答案,建议在应用程序处于纵向时使用 StackNavigationViewStyle,但随后该应用程序看起来就像一个巨大的 iPhone,并且像侧边栏一样消失了主类以显示为视图。

这就是我的代码。

struct ContentView: View {
    var body: some View {
        NavigationView {
            MyMasterView()
            DetailsView()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct MyMasterView: View {

    var people = ["Option 1", "Option 2", "Option 3"]

    var body: some View {

        List {
            ForEach(people, id: \.self) { person in
                NavigationLink(destination: DetailsView()) {
                    Text(person)
                }
            }
        }

    }
}

struct DetailsView: View {

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

swiftui ipados swiftui-navigationview swiftui-navigationsplitview

5
推荐指数
1
解决办法
1478
查看次数

SwiftUI 4:当状态更改时,navigationDestination() 的目标视图不会更新

在尝试 SwiftUI 4 中的新功能时NavigationStack,我发现当状态更改时,返回的目标视图navigationDestination()不会更新。请参阅下面的代码。

struct ContentView: View {
    @State var data: [Int: String] = [
        1: "One",
        2: "Two",
        3: "Three",
        4: "Four"
    ]

    var body: some View {
        NavigationStack {
            List {
                ForEach(Array(data.keys).sorted(), id: \.self) { key in
                    NavigationLink("\(key)", value: key)
                }
            }
            .navigationDestination(for: Int.self) { key in
                if let value = data[key] {
                    VStack {
                        Text("This is \(value)").padding()
                        Button("Modify It") {
                            data[key] = "X"
                        }
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

重现问题的步骤:

  1. 运行代码并单击列表中的第一项。这将带您进入该项目的详细视图。

  2. 详细视图显示了该项目的价值。它还具有一个用于修改值的按钮。单击该按钮。您会发现详细视图中的值 …

ios swiftui swiftui-navigationsplitview

5
推荐指数
1
解决办法
4148
查看次数

点击 NavigationSplitView 上的不同按钮时如何避免重建视图

我尝试过苹果示例 为您的 SwiftUI 应用程序带来强大的导航结构

所以我的代码看起来像这样

        NavigationSplitView(
            columnVisibility: $navigationModel.columnVisibility
        ) {
            List(
                categories,
                selection: $navigationModel.selectedCategory
            ) { category in
                NavigationLink(category.localizedName, value: category)
            }
            .navigationTitle("Categories")
            .toolbar {
                ExperienceButton(isActive: $showExperiencePicker)
            }
        } detail: {
            NavigationStack(path: $navigationModel.recipePath) {
                RecipeGrid(category: navigationModel.selectedCategory)
            }
        }
Run Code Online (Sandbox Code Playgroud)

详情查看

struct RecipeGrid: View {
    var category: Category?
    var dataModel = DataModel.shared

    var body: some View {
        ZStack {
            if let category = category {
                ScrollView {
                    LazyVGrid(columns: columns) {
                        ForEach(dataModel.recipes(in: category)) { recipe in
                            NavigationLink(value: recipe) {
                                RecipeTile(recipe: recipe)
                            }
                            .buttonStyle(.plain) …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationlink swiftui-navigationsplitview swiftui-navigationstack

5
推荐指数
1
解决办法
454
查看次数

SwiftUI:如何使用 iOS16/iPadOS16 NavigationSplitView 和 NavigationLink 更新远程孩子的详细信息列

我正在尝试更新旧的应用程序以使用新的 NavigationSplitView 和 NavigationLink,但当侧边栏具有子对象层次结构并且我想从远处更新详细视图时,我试图以正确的方式进行操作子对象。例如,基于 WWDC2022 示例项目 Navigation Cookbook,我尝试了以下操作,但没有成功:

测试应用程序.swift

@main

struct TestApp: App {
  @StateObject var appState = AppState()

  var body: some Scene {
    WindowGroup {

      NavigationSplitView {
         ProjectListView()
      } detail: {
        if let chapter = appState.chapter {
          ChapterDetailView(chapter: chapter)
        } else {
          Text("Pick a Chapter")
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

ChapterListView.swift < ProjectListView() 的远亲(向下 3 级)兄弟

List(selection: $appState.chapter) {
  ForEach(chapters) { chapter in
    NavigationLink(chapter.title ?? "A Chapter", value: chapter)
  }
}
Run Code Online (Sandbox Code Playgroud)

appState.swift

class AppState: ObservableObject {
  @Published var chapter: …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationlink ios16 swiftui-navigationsplitview ipados16

4
推荐指数
1
解决办法
732
查看次数

NavigationSplitView 内的 SwiftUI NavigationStack 无法在 iPhone 和 iPad 上运行

我正在尝试使用NavigationStack内部NavigationSplitView

struct ContentView: View {
    @State var mainMenu: MenuItem?
    @State var subMenu: SubMenuItem?
    
    var body: some View {
        NavigationSplitView {
            List(MenuItem.allCases, selection: $mainMenu) { item in
                NavigationLink(value: item) {
                    Text(item.rawValue)
                }
            }
        } detail: {
            NavigationStack {
                List(SubMenuItem.allCases, selection: $subMenu) { item in
                    NavigationLink(value: item) {
                        Text(item.rawValue)
                    }
                }
                .navigationDestination(for: SubMenuItem.self) { selected in
                    DetailView(item: selected)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
struct DetailView: View {
    let item: SubMenuItem
    
    var body: some View {
        Text(item.id)
    }
} …
Run Code Online (Sandbox Code Playgroud)

ios swiftui swiftui-navigationlink swiftui-navigationsplitview swiftui-navigationstack

4
推荐指数
1
解决办法
4113
查看次数

SwiftUI 中新的 NavigationStack 过渡,如何从默认幻灯片更改为自定义或显示?

我有 NavigationStack 及其自己的导航链接,用于 iOS16 开发。

如何更改要显示的默认幻灯片过渡或自定义过渡?

另外,您是否在 NavigationStack 或 NavigationLink 上应用转换?

这是我的代码:

import SwiftUI

struct TestView: View {
    var body: some View {
        NavigationStack() {
            NavigationLink ("Link", value: "Any Value")
                .navigationDestination(for: String.self) { textValue in
                    destinationView(textValue: textValue)
                }
        }
    }
}

struct destinationView: View {
    let textValue: String
    var body: some View {
            Text(textValue)
    }
}
Run Code Online (Sandbox Code Playgroud)

如何更改默认转换?

swiftui swiftui-navigationlink swiftui-animation swiftui-navigationsplitview swiftui-navigationstack

4
推荐指数
1
解决办法
3681
查看次数