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
相关产品推荐
相关产品推荐

