You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xcode macOS App开发中多次视图跳转失效问题如何解决?

问题原因

该异常由macOS端SwiftUI的NavigationView默认行为导致:macOS上NavigationView默认采用「侧边栏+详情页」的多栏布局,第一次点击跳转后详情页已被填充,在没有手动绑定选中状态的前提下,后续点击NavigationLink不会触发详情页更新,因此看起来跳转失效。

解决方案

方案1(推荐,适配macOS 13及以上版本)

直接用苹果官方主推的NavigationStack替代已被标记为废弃的NavigationView,原生栈式导航逻辑可直接避免该问题,仅需修改ContentView代码如下:

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    @FetchRequest(
        sortDescriptors: [], animation: .default) private var postits: FetchedResults<Postit>

    var body: some View {
        // 将原NavigationView替换为NavigationStack
        NavigationStack {
            ScrollView {
                VStack {
                    
                    NavigationLink(destination: CreatePostitView()) {
                        Image(systemName: "plus")
                    } 
                    
                    ForEach(postits) {postit in
                        NavigationLink(destination: PostitView(title: postit.title! , 
                        content: postit.content!)) {
                            Text(postit.title!)
                        }
                        .frame(width: 100, height: 100)
                        .background(Color.yellow.opacity(0.3))
                        .shadow(color: Color.yellow, radius: 10)
                        .padding(16)
                    }
                }
            }
        }
    }
}

方案2(兼容macOS 12及更低版本)

如果需要适配旧系统,保持NavigationView的前提下,强制指定栈式导航样式即可,仅需给NavigationView新增一行修饰符:

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    @FetchRequest(
        sortDescriptors: [], animation: .default) private var postits: FetchedResults<Postit>

    var body: some View {
        NavigationView {
            ScrollView {
                VStack {
                    
                    NavigationLink(destination: CreatePostitView()) {
                        Image(systemName: "plus")
                    } 
                    
                    ForEach(postits) {postit in
                        NavigationLink(destination: PostitView(title: postit.title! , 
                        content: postit.content!)) {
                            Text(postit.title!)
                        }
                        .frame(width: 100, height: 100)
                        .background(Color.yellow.opacity(0.3))
                        .shadow(color: Color.yellow, radius: 10)
                        .padding(16)
                    }
                }
            }
        }
        // 新增该行修饰符,强制使用栈式导航样式
        .navigationViewStyle(.stack)
    }
}

两种方案均无需修改CreatePostitView和PostitView的现有代码。

内容的提问来源于stack exchange,提问作者Fovu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:15:01