我正在尝试 ipadOS16/macOS13 中提供的新导航 API,但在弄清楚如何在 macOS 13 上将 NavigationSplitView、NavigationStack 和 NavigationLink 组合在一起时遇到了一些麻烦(在 Macbook Pro M1 上进行测试)。相同的代码在 ipadOS 上可以正常工作。
我正在使用两列 NavigationSplitView。在“详细信息”部分中,我有一个SampleModel1包含在 NavigationStack 中的实例列表。在列表中,我已为SampleModel1和SampleModel2实例应用了 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) 还有其他人在 iOS 16.1 中遇到这个问题吗?NavigationSplitView在NavigationTitle视图加载后加载?\xe2\x80\x93 在 iOS 16.0 上运行良好。(https://i.stack.imgur.com/G0IUG.gif)
它实际上是相同的代码,但它只在 iOS 16.1 上给我带来了问题。
\n更新:这在 iOS 16.2 和 16.3 上仍然是一个问题。
\n@Hunter更新:Apple 似乎已在 iOS 16.4 Beta 1 上修复了此问题。
\nswiftui ios16 swiftui-navigationsplitview navigationsplitview
我试图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) 我在 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
在尝试 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)
重现问题的步骤:
运行代码并单击列表中的第一项。这将带您进入该项目的详细视图。
详细视图显示了该项目的价值。它还具有一个用于修改值的按钮。单击该按钮。您会发现详细视图中的值 …
我尝试过苹果示例 为您的 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
我正在尝试更新旧的应用程序以使用新的 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
我正在尝试使用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
我有 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